Spring 对 bean 的管理细节
一:bean 的三种方式
1.使用默认构造函数创建
在spring配置文件中适用bean标签,配置id和class属性后,且没有其他属性标签时,采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建
<bean id="userService" class="service.impl.UserServiceImpl"></bean>
2.使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器当中)
public class InstanceFactory {
public IUserService getIUserService(){
return new UserServiceImpl();
}
}
<bean id="instanceFactory" class="factory.InstanceFactory"></bean>-->
<bean id="userService" factory-bean="instanceFactory" factory-method="getIUserService"</bean>
3.使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
public class StaticFactory {
public static IUserService getIUserService(){
return new UserServiceImpl();
}
}
<bean id="userService" class="factory.StaticFactory" factory-method="getIUserService"></bean>
调用测试
//获取核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("dao.xml");
//根据ID获取bean对象
IUserService us = (IUserService) ac.getBean("userService");
二:bean对象的作用范围
即 bean 标签的 scope 属性
- singleton:单例模式,每次获取都返回同一个实例,相对于同一个IOC容器而言。
- prototype:原型模式,每次获取返回不同实例,创建后的生命周期不再由IOC容器管理。
- request:作用域为同一个
Http Request
。 - session:作用域为同一个
Http Session
。 global session:被移除- application:作用域为同一个WEB容器,可以看做Web应用中的单例模式。
- websocket:作用域为同一个
WebSocket
应用。
三:bean对象的生命周期
主要解释单例和多例(原型)
单例 | 多例 | |
---|---|---|
出生 | 容器创建时对象出生 | 使用对象时,spring为我们创建 |
存活 | 容器存活,则对象一直存活 | 对象在使用过程中就一直存活 |
死亡 | 容器销毁,对象消亡 | 当对象长时间不使用,且没有其他对象引用,由 java 垃圾回收器回收 |