Bean的声明周期
1)容器启动时创建Bean
2)给Bean通过DI设置对象属性
3)如果Bean实现了BeanNameAware接口,则会调用BeanNameAware接口中的SetBeanName();
4)如果 bean实现了BeanFactoryAware 接口,工厂通过传递自身的实例来调用setBeanFactory()。
5)如果存在与 bean 关联的任何BeanPostProcessors(前置处理器),则调用preProcessBeforeInitialization() 方法。
6)如果Bean重写了initMethod()则会调用该方法。
<!--initMethod()和destoryMethod()方法必须没有参数,但是可以引发任何异常。-->
<bean id="person" class="com.wu.pojo.Person"
init-method="Myinit" destroy-method="MyDestory">
//对应Bean里面的方法
public void Myinit(){
System.out.println("容器关闭");
}
public void MyDestory(){
System.out.println("容器销毁");
}
7)如果存在与 bean 关联的任何BeanPostProcessors(前置处理器),则调用postProcessAfterInitialization() 方法。
<bean id="person" class="com.wu.pojo.Person" init-method="Myinit" destroy-method="MyDestory">
</bean>
<!--beanPostProcessors为ioc容器中所有的bean共享-->
<bean id="beanPostProcessors" class="com.wu.pojo.MyBeanPostProcessors">
</bean>
8)如果 bean 实现DisposableBean 接口,当 spring 容器关闭时,会调用destory(),这一步在Bean是多例的时候不会执行。
9)关闭IOC容器,销毁Bean 如果Bean指定了destoryMehtod,则会调用它。
注:关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种:
第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
第二种是:通过 在xml中定义init-method 和 destory-method方法
第三种是: 通过bean实现InitializingBean和 DisposableBean接口
Spring项目启动时 加载顺序 (这是我一直很好奇的 看看就行了)
Spring 源码分析: @PostConstruct、InitializingBean、ApplicationContextAware、ApplicationListener 的执行顺序
Spring 版本: 5.2.2.RELEASE
先上结论,顺序是:
1. 构造函数
2. 依赖的bean被初始化完成,并注入到了当前bean 中 (循环依赖时,稍微不同)
3. ApplicationContextAware 接口的 setApplicationContext 方法
4. @PostConstruct 注解的方法(ApplicationRunner)
5. InitializingBean 接口的 afterPropertiesSet 方法
6. 等所有 bean 初始化完成后,ApplicationListener 接口的 onApplicationEvent 方法接收 ContextRefreshedEvent 事件。