Bean的生命周期
1、生命周期
Bean创建 —>初始化—>销毁的过程,在这个过程中可以做一些拓展
2、bean的生命周期
- 通过无参构造器创建bean实例
- 为bean设置属性值和对其他bean的引用
bean初始化前做操作,BeanPostProcessor中的方法 - 调用bean的初始化方法
bean初始化后做操作,BeanPostProcessor中的方法 - 可以使用bean
- 关闭容器,销毁容器
没有使用BeanPostProcessor中的方法的示例
public class Orders {
private String name;
public Orders() {
System.out.println("1、无参构造被调用");
}
public void setName(String name) { System.out.println("2、设置属性的值");
this.name = name;
}
//创建初始化方法
public void initMethod(){
System.out.println("3、执行初始化方法");
}
//创建销毁方法
public void destroy(){
System.out.println("5、销毁了对象");
}
<bean class="com.chzu.spring05.Orders" id="order1" init-method="initMethod"
destroy-method="destroy"> <property name="name" value="start"></property></bean>
测试结果:
1、无参构造被调用
2、设置属性的值
3、执行初始化方法
Orders{name='start'}
使用BeanPostProcessor
//创建一个类实现BeanPostPocessor接口,实现方法
public class PostUtil implements BeanPostProcessor{
//初始化之前的操作
@Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之前执行");
return bean;
}
//初始化之后的操作
@Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化之后执行");
return bean;
}
}
<!--配置后置处理器,当配置文件被加载时,会创建对象,Spring会识别其为后置处理器,会在所有bean创建时起作用-->
<bean class="com.chzu.spring05.PostUtil" id="postUtil"></bean>
执行结果:
1、无参构造被调用
2、设置属性的值
初始化之前执行
3、执行初始化方法
初始化之后执行
Orders{name='start'}
容器管理Bean的生命周期
可以自定义初始化和销毁方法,容器在Bean执行到当前生命周期的时候调用我们自定义的方法
1)、创建IOC容器
单实例容器启动时创建对象
对象创建完成,并赋值好,调用初始化方法
容器关闭,调用销毁方法
多实例每次获取时创建对象
对象创建完成,并赋值好,调用初始化方法
多实例对象不进行销毁
@Bean(initMethod=“方法名” destoryMethod=“方法名”)
2)、InitializiBean接口、DisposableBean接口
对象创建完成,并赋值好,会调用InitializigBean接口中的方法
销毁则会调用DisposableBean接口中的方法
3)、PostConstruct注解,可以标注在方法上 ,进行初始化
PreDestory注解,销毁
4)、BeanPostProcessor组件,接口 ,bean的后置处理器
在bean初始化的前后做一些处理工作
postProcessBeforInitialization 在bean创建之后但是在任何的初始化之前
postProcessAfterInitialization 在bean任何的初始化之后
Spring底层对BeanPostProcessor的使用
applicationContextAware在bean对象初始化之前