1、构建 (构造函数:或者说是 construct)
2、初始化(init)
3、销毁 (destory)
再复杂一点的生命周期是:
1、构建
2、设置属性
3、后置处理器 的前置处理方法: BeanPostProcessor.postProcessBeforeInitialization
4、初始化(init)
5、后置处理器 的后置处理方法: BeanPostProcessor.postProcessAfterInitialization
6、销毁
每个步骤都有各自的工作。比如我们如果要在 bean 被注入到IOC之前完成一些工作,或者要修改被 setter 的属性。都需要到对应的步骤 修改对应的处理器,或者方法。
具体对应的步骤,我们放到后面来说。
如果是 单实例:在容器启动的时候创建对象。注入到 IOC
如果是多实例:在每次获取的时候创建对象
对象创建完成,并且赋值之后,调用初始化方法。
单实例:容器关闭的时候
多实例:容器不会关闭这个 Bean,容器不会调用销毁方法。
@Bean(initMethod = "initMethod", destroyMethod = "destoryMethod") public Car car() { return new Car(); }
通过制定 initMethod 和 destroyMethod 方法来实现自定义的 init 和 destory 方法。
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 的方法。
@PostConstruct public void initMethod() { System.out.println("Dog...init--- PostConstruct"); } @PreDestroy public void destroyMethod() { System.out.println("Dog...destroy--PreDestroy"); }
使用 @PostConstruct 和 @PreDestroy 注解。
后置处理器是 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 实现的
关键步骤:
populateBean(beanName, mbd, instanceWrapper) : 完成属性的赋值
initializeBean(beanName, exposedObject, mbd); 完成初始化的工作。
保护一下步骤:
applyBeanPostProcessorsBeforeInitialization:
invokeInitMethods(beanName, wrappedBean, mbd);
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);