概念
Spring容器里装的是需要管理的对象,装在一个HashMap集合中。我们用容器来实例化对象,管理对象之间的依赖
只要实现了BeanFactory和ApplicationContext接口的类,那么这两个接口的类都可以作为Spring容器
BeanFactory
是最顶层最基本的接口,它描述了容器需要实现的最基本的功能
ApplicationContext
继承了BeanFactory接口,它描述的内容更加广泛。它是把beans.xml文件里的内容先存放到HashMap容器里,需要用的时候从里面取,用得最多
实例化Bean的三种方式
在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是由Spring IoC 容器实例化、组装和管理的对象
1)使用默认无参构造函数
在默认情况下,它会根据默认无参构造函数来创建类对象,如果bean中没有默认无参构造函数,将会创建失败
beans.xml文件中
<bean id="accountDao" class="xn.xh.dao.impl.AccountDaoImpl"/>
AccountDaoImpl.java文件中
public class AccountDaoImpl implements IAccountDao {
//无参构造函数。如果一个类没有定义任何的构造函数,那么会自动生成一个无参构造函数
public AccountDaoImpl() {
System.out.println("创建了对象!");
}
===========================================================
//如果上面这个代码改成下面这样,执行client时就会报错
public AccountDaoImpl(String name) {
System.out.println("创建了对象!");
}
===========================================================
@Override
public void saveAccount() {
System.out.println("jdbc保存账户!");
}
}
client.java文件中
public class client {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
IAccountDao accountDao = (IAccountDao)context.getBean("accountDao");
accountDao.saveAccount();
//运行结果为在控制台打印出:创建了对象! Jdbc保存账户!
}
}
2)spring管理静态工厂,使用静态工厂的方法创建对象
模拟一个静态工厂,创建数据层实现类
beans.xml文件中
<bean id="accountDao" class="xn.xh.factory.StaticFactory" factory-method="createAccountDao" />
AccountDaoImpl.java文件中
public class AccountDaoImpl implements IAccountDao {
public AccountDaoImpl() {
System.out.println("创建了对象!");
}
@Override
public void saveAccount() {
System.out.println("jdbc保存账户!");
}
}
StaticFactory文件中
public class StaticFactory {
public static IAccountDao createAccountDao() {
return new AccountDaoImpl();
}
}
client.java文件中
public class client {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
IAccountDao accountDao = (IAccountDao)context.getBean("accountDao");
accountDao.saveAccount();
//运行结果为在控制台打印出:创建了对象! Jdbc保存账户!
}
}
执行过程解析
此种方法是
使用StaticFactory类中的静态方法createAccountDao创建对象,并存入spring容器
id属性:指定bean的id,用于从容器中获取
class属性:指定静态工厂的全限定类名
factory-method属性:指定生产对象的静态方法
3)spring管理实例工厂-使用实例工厂的方法创建对象
模拟一个实例工厂,创建业务层实现类
次工厂创建对象,必须有工厂实例对象,再调用方法
beans.xml文件中
<bean id="InstanceFactory" class="xn.xh.factory.InstanceFactory" />
<bean id="accountDao" factory-bean="InstanceFactory" factory-method="createAccountDao" />
AccountDaoImpl.java文件中
public class AccountDaoImpl implements IAccountDao {
public AccountDaoImpl() {
System.out.println("创建了对象!");
}
@Override
public void saveAccount() {
System.out.println("jdbc保存账户!");
}
}
InstanceFactory.java文件中
public class InstanceFactory {
public IAccountDao createAccountDao() {
return new AccountDaoImpl();
}
}
client.java文件中
public class client {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
IAccountDao accountDao = (IAccountDao)context.getBean("accountDao");
accountDao.saveAccount();
//运行结果为在控制台打印出:创建了对象! Jdbc保存账户!
}
}
执行过程解析
2)和3)那么麻烦,为什么不只用1)的方法进行创建实例对象呢? 比如上面工厂(InstanceFactory类)是第三方的jar包,我们无法修改里面的代码,但又想通过它来生成实例对象时就要用到了
bean标签
作用
用于配置对象让spring来创建的
属性
id:给对象在容器中提供一个唯一标识,用于获取对象
class:指定类的全限定类名,用于反射创建对象
scope:指定对象的作用范围
・singleton:默认值,单例的
・prototype:多例的
・request:web项目中Spring创建一个Bean的对象,将对象存入到request域中
・session:web项目中Spring创建一个Bean的对象,将对象存入到session域中
bean的作用范围和生命周期
单例对象
scope=“singleton”
一个应用只有一个对象的实例,它的作用范围就是整个引用
在加载beans.xml文件的时候创建对象,放入到HashMap集合当中,只会被创建一次。用getBean()方法调用的时候直接去集合里取
生命周期
・对象出生:当应用加载,创建容器时,对象就被创建了
・对象活着:只要容器在,对象一直活着
・对象死亡:当应用卸载,销毁容器时,对象就会被销毁
多例对象
scope="prototype"
每次访问对象时,都会重新创建对象实例
生命周期
・对象出生:当使用对象时,创建新的对象实例
・对象活着:只要对象在使用中,就一直活着
・对象死亡:当对象长时间不用时,被java的垃圾回收器回收了
网友评论