Bean的生命周期:
bean创建—初始化—-销毁的过程
容器管理bean的生命周期;
我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法。
1. 指定初始化和销毁方法
1.1 xml方式
1 | <bean id="person" class="com.rocklei123.bean.Person" init-method="" destroy-method=""> |
1.2 注解方式
可通过@Bean(initMethod = “init”,destroyMethod = “destroy”)指定初始化及销毁方法,通过测试可以确定:
构造对象:
- 单实例:在容器启动的时候创建对象
- 多实例:在每次获取的时候创建对象
初始化:
* 对象创建完成,并赋值好,调用初始化方法。
销毁:
- 单实例:容器关闭的时候
- 多实例:容器不会管理这个bean;容器不会调用销毁方法;
1.2.1 单实例情况测试
1 | public class Car { |
通过以下测试结果可以确定Spring容器管理(单实例)Bean的过程为:
Bean构造方法–>Bean init()–>IOC容器创建完成–>关闭容器–>Bean销毁
1 | 十二月 09, 2018 9:25:32 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh |
1.2.2多实例情况下测试
1 |
|
通过以下测试结果可以确定Spring容器管理(多实例)Bean的过程为(多实例注意:不会调用销毁方法):
IOC容器创建完成–>Bean构造方法–>Bean init()–>关闭容器
1 | 十二月 14, 2018 10:11:55 上午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh |
2. 实现InitializingBean和DisposableBean接口
Bean实现InitializingBean(定义初始化逻辑);重写afterPropertiesSet()方法,表示构造方法完成后,并且属性赋值完成后执行该方法
DisposableBean(定义销毁逻辑);容器销毁时调用
测试代码:
1 | //实体类 |
测试结果:
1 | 十二月 14, 2018 3:27:38 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh |
3. JSR250 @PostConstruct 和@PreDestroy
- @PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
- @PreDestroy:在容器销毁bean之前通知我们进行清理工作
示例代码:
1 | import javax.annotation.PostConstruct; |
测试结果:
1 | 十二月 14, 2018 3:33:03 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh |
4. 实现BeanPostProcessor接口
BeanPostProcessor【interface】:Spring 为我们提供的bean的后置处理器;在bean初始化前后进行一些处理工作;同时可以对这个bean进行包装并返回。
- postProcessBeforeInitialization:在任何初始化方法调用之前工作
- postProcessAfterInitialization:在任何初始化方法调用之后工作
1 | package com.rocklei123.bean; |
测试结果:
1 | 十二月 14, 2018 5:09:06 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh |
5. Bean 生命周期管理方法总结
- 1)、指定初始化和销毁方法;通过@Bean指定init-method和destroy-method;
- 2)、通过让Bean实现InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑);
- 3)、可以使用JSR250;
- @PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
- @PreDestroy:在容器销毁bean之前通知我们进行清理工作
- 4)、BeanPostProcessor【interface】:bean的后置处理器;
在bean初始化前后进行一些处理工作;- postProcessBeforeInitialization:在初始化之前工作
- postProcessAfterInitialization:在初始化之后工作
6. BeanPostProcessor介绍与原理
BeanPostProcessor 源码:
1 | public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory |
BeanPostProcessor核心原理总结1
2
3
4
5
6
7populateBean(beanName, mbd, instanceWrapper);给bean进行属性赋值
initializeBean
{
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
invokeInitMethods(beanName, wrappedBean, mbd);执行自定义初始化
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
Spring底层大量 BeanPostProcessor 的使用;比如bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor;
6.1 ApplicationContextAwareProcessor 后置处理器
ApplicationContextAwareProcessor 接口,是Spring容器提供获取IOC容器接口,其内部实现也是后置处理器原理。示例代码:
1 | public class Dog implements ApplicationContextAware { |
7. Bean生命周期总结
- 构造(对象创建)
1 | * 单实例:在容器启动的时候创建对象 |
- BeanPostProcessor.postProcessBeforeInitialization
- 初始化:
1 | * 对象创建完成,并赋值好,调用初始化方法。。。 |
- BeanPostProcessor.postProcessAfterInitialization
- 销毁:
1 | * 单实例:容器关闭的时候 |
其实Spring容器整个生命周期还有其他几个步骤,下图给出整个Spring容器管理bean的生命周期。