在Spring容器中,主要是对bean进行管理的,而我们创建的bean其实是有对应的生命周期,我们需要对这个生命周期有一个了解。其实Spring这个对bean的生命周期就是对传统的java的生命周期给复杂化一些。那下面我就了解下bean的生命周期。
在Spring中bean的生命周期就像我们在上面的图片看到一样,加了一些过滤条件(黑色框的平时基本上不会用到)。那分别介绍下上面的流程
1.Spring对bean进行实例化,调用bean的构造参数
2.设置对象属性,调用bean的set方法,将属性注入到bean的属性中
3.检查bean是否实现BeanNameAware、BeanFactoryAware、ApplicationContextAware接口,如果实现了这几个接口Spring会分别调用其中实现的方法。
BeanNameAware:setBeanName(String name)方法,参数是bean的ID
BeanFactoryAware:setBeanFactory(BeanFactory bf)方法,参数是BeanFactory容器
ApplicationContextAware:setApplicationContext(ApplicationContext context)方法,参数是bean所在的引用的上下文,如果是用Bean工厂创建bean,那就可以忽略ApplicationContextAware。
4.如果bean是否实现BeanPostProcessor接口,Spring会在初始化方法的前后分别调用postProcessBeforeInitialization和postProcessAfterInitialization方法
5.如果bean是否实现InitalizingBean接口,将调用afterPropertiesSet()方法
6.如果bean声明初始化方法,也会被调用
7.使用bean,bean将会一直保留在应用的上下文中,直到该应用上下文被销毁。
8.检查bean是否实现DisposableBean接口,Spring会调用它们的destory方法
9.如果bean声明销毁方法,该方法也会被调用
接下来我们看看代码:
实体类 TestBean
分别实现了BeanNameAware、BeanFactoryAware、ApplicationContextAware、InitalizingBean、DisposableBean接口
MySpringBeanPostProcessor实现了BeanPostProcessor接口
通过java配置对进行bean的创建,要注意一点我们要自定义初始化和销毁方法,需要在initMethod和destroyMethod两个方法分别写上对应的方法名。这个销毁方法需要注意,如果是和DisposableBean接口是同一个方法,那么只会执行一次。但如果两个不一样的方法,那么就会先执行DisposableBean的detroy方法,在执行自定义销毁方法。
加载上下文应用
从输出结果,我们就可以清楚地看到整个bean的生命周期。
其实对于这一块,我们了解下就可以了,因为真正用到的话其实不多,但我们还是要清楚bean的生命周期,会对之后学习或者工作都会有很大的帮助。