Spring Bean的生命周期
生命周期
1.调用类的初始化方法(通过构造器 和或 getter setter 为bean的属性注入)
2.调用bean的初始化方法(init-method)
3.调用bean的析构方法(destroy-method) 该方法在ioc容器调用close()方法的时候会调用
BeanPostProcessor接口
1.有两个回调方法。
2.当一个BeanPostProcessor的实现类注册到Spring IOC容器后,对于该Spring IOC容器所创建的每个bean实例在初始化方法(如afterPropertiesSet和任意已声明的init方法)调用前,将会调用BeanPostProcessor中的postProcessBeforeInitialization方法,而在bean实例初始化方法调用完成后,则会调用BeanPostProcessor中的postProcessAfterInitialization方法
3.整个调用顺序可以简单示意如下:
- Spring IOC容器实例化Bean (调用类的构造器 )
- 调用BeanPostProcessor的postProcessBeforeInitialization方法
- 调用bean实例的初始化方法(init-method)
- 调用BeanPostProcessor的postProcessAfterInitialization方法
- 调用bean实例的初始化方法(destory-method)
可以看到,Spring容器通过BeanPostProcessor给了我们一个机会对Spring管理的bean在进行bean调用inti-method前后再加工。比如:我们可以修改bean的属性,可以给bean生成一个动态代理实例等等。一些Spring AOP的底层处理也是通过实现BeanPostProcessor来执行代理包装逻辑的。
使用方法:
创建一个实现BeanPostProcessor接口的类,实现上述的两种方法;在xml配置文件中写入
在实现BeanPostProcessor接口的类的两种方法中 Object bean, String beanName 。 bean代表bean的实例本身,beanName代表bean的名字。返回值即放回到容器中的bean可以随意修改的!
如:
<!--不需要进行特殊配置 ioc容器会自动识别-->
<bean class="com.an.cycle.MyBeanPostProcessor"/>
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization"+beanName+","+bean);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization"+beanName+","+bean);
Car car = (Car)bean;
((Car) bean).setPrice(999.0);
return bean;
}
}