2.1 生命周期的流程
1、构建 (构造函数:或者说是 construct)
2、初始化(init)
3、销毁 (destory)
再复杂一点的生命周期是:
1、构建
2、设置属性
3、后置处理器 的前置处理方法: BeanPostProcessor.postProcessBeforeInitialization
4、初始化(init)
5、后置处理器 的后置处理方法: BeanPostProcessor.postProcessAfterInitialization
6、销毁
每个步骤都有各自的工作。比如我们如果要在 bean 被注入到IOC之前完成一些工作,或者要修改被 setter 的属性。都需要到对应的步骤 修改对应的处理器,或者方法。
具体对应的步骤,我们放到后面来说。
构建特性:
如果是 单实例:在容器启动的时候创建对象。注入到 IOC
如果是多实例:在每次获取的时候创建对象
初始化:
对象创建完成,并且赋值之后,调用初始化方法。
销毁:
单实例:容器关闭的时候
多实例:容器不会关闭这个 Bean,容器不会调用销毁方法。
2.2 自定义初始化和销毁的方法
1、注入bean
@Bean(initMethod = "initMethod", destroyMethod = "destoryMethod")
public Car car() {
return new Car();
}
通过制定 initMethod 和 destroyMethod 方法来实现自定义的 init 和 destory 方法。
2、通过接口
public class Cat implements InitializingBean, DisposableBean {
public Cat() {
System.out.println("Cat...constructor");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Cat...属性赋值之后 init 方法");
}
@Override
public void destroy() throws Exception {
System.out.println("Cat...destroy");
}
}
实现 InitializingBean 的接口,通过方法 afterPropertiesSet 来完成 init 之前的工作。(另外可以看出在 属性设置之后)。通过 destroy 方法来完成 destory 的方法。
3、通过 JSR250
@PostConstruct
public void initMethod() {
System.out.println("Dog...init--- PostConstruct");
}
@PreDestroy
public void destroyMethod() {
System.out.println("Dog...destroy--PreDestroy");
}
使用 @PostConstruct 和 @PreDestroy 注解。
4、BeanPostProcessor
后置处理器是 Spring 最酷的功能。
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Bean Post Processor....postProcessBeforeInitialization...." + beanName + bean);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Bean Post Processor....postProcessAfterInitialization" + beanName+ bean);
return bean;
}
}
Spring 底层的注解 比如 bean赋值,注入其他组件, @Async 都是通过 beanPostProcessor 实现的
2.3 debug 流程
关键步骤:
populateBean(beanName, mbd, instanceWrapper) : 完成属性的赋值
initializeBean(beanName, exposedObject, mbd); 完成初始化的工作。
保护一下步骤:
applyBeanPostProcessorsBeforeInitialization:
invokeInitMethods(beanName, wrappedBean, mbd);
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。