Bean 生命周期
- 实例化,new
对Bean进行配置 -- IOC注入
- 如果实现BeanNameAware接口,调用setBeanName()
- 如果实现BeanFactoryAware接口,调用setBeanFactory()
- 如果实现ApplicationContextAware接口,调用setApplicationContext()
- 如果实现
BeanPostProcessor
中postProcessorBeforeInitialization()
- 调用配置的初始化方法
- 调用BeanPostProcessor中postProcessorAfterInitialization()
- 使用
- 销毁destroy()
Bean实例化过程中修改成员变量,怎么做?
spring容器初始化时,从资源中读取到bean的相关定义后,保存在beanFactory的成员变量中(参考DefaultListableBeanFactory类的成员变量beanDefinitionMap),在实例化bean的操作就是依据这些bean的定义来做的,而在实例化之前,spring允许我们通过自定义扩展来改变bean的定义,定义一旦变了,后面的实例也就变了,而beanFactory后置处理器,即BeanFactoryPostProcessor就是用来改变bean定义的;
postProcessBeforeInitialization:该方法主要针对spring在bean初始化时调用初始化方法前进行自定义处理。postProcessAfterInitialization:该方法主要针对spring在bean初始化时调用初始化方法后进行自定义处理。BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术
Bean实例化
xml配置实现三种方法:普通构造方法,静态工厂,实例工厂
- 普通构造方法
<bean class="org.sang.User" id="user"/>
- 静态工厂 static方法
<bean id="user2" class="org.sang.User2Factory" `factory-method`="getInstance"/>
public static User2 getInstance() {
return new User2();
}
}
- 实例工厂 非static方法
<bean class="org.sang.User3Factory" id="user3Factory"/>
<bean id="user3" factory-bean="user3Factory" factory-method="getUser3"/>
public class User3Factory {
public User3 getUser3() {
return new User3();
}
}
Bean元素作用域
- Singleton 单例
- Prototype 多例 每次getBean,新bean实例
- Request 每次http请求,使用request定义的bean,新实例
- Session 每次http session
- Globalsession
网友评论