时间:2021-05-19
一、从源码注释看bean生命周期
从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为:
1.BeanNameAware setBeanName 设置bean名称
2.BeanClassLoaderAware setBeanClassLoader 设置bean类加载器
3.BeanFactoryAware setBeanFactory 设置bean工厂
4.EnvironmentAware setEnvironment 设置环境:profiles+properties
5.EmbeddedValueResolverAware setEmbeddedValueResolver 设置嵌入式值解析器
6.ResourceLoaderAware setResourceLoader 设置资源载入器,只适用于在应用程序上下文中运行
7.ApplicationEventPublisherAware setApplicationEventPublisher注入应用事件发布器ApplicationEventPublisher
8.MessageSourceAware setMessageSource 设置国际化支持
9.ApplicationContextAware setApplicationContext 设置应用上下文
10.ServletContextAware setServletContext 设置servlet上下文
11.BeanPostProcessors postProcessBeforeInitialization 执行bean处理器前置方法
12.InitializingBean afterPropertiesSet 执行初始化Bean设置完属性后置方法
13.a custom init-method definition 执行自定义初始化方法
14.BeanPostProcessors postProcessAfterInitialization 执行bean处理器后置方法
销毁顺序:
1.DestructionAwareBeanPostProcessors postProcessBeforeDestruction 销毁处理器的前置方法
2.DisposableBean destroy Bean销毁回调方法
3.a custom destroy-method definition 用户自定义销毁方法
核心方法流程图:
二、测试验证
2.1分析原理
前面说的17个步骤都可以测试,我们选取其中的8个步骤进行测试如下:
初始化流程:
1.BeanNameAware setBeanName 设置bean名称
3.BeanFactoryAware setBeanFactory 设置bean工厂
11.BeanPostProcessors postProcessBeforeInitialization 执行bean处理器前置方法
12.InitializingBean afterPropertiesSet 执行初始化Bean设置完属性后置方法
13.a custom init-method definition 执行自定义初始化方法
14.BeanPostProcessors postProcessAfterInitialization 执行bean处理器后置方法
销毁流程:
2.DisposableBean destroy Bean销毁回调方法
3.a custom destroy-method definition 用户自定义销毁方法
2.2 代码清单
1.构建一个Person类,实现BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean接口。
package spring.ioc;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.BeanFactoryAware;import org.springframework.beans.factory.BeanNameAware;import org.springframework.beans.factory.DisposableBean;import org.springframework.beans.factory.InitializingBean;public class Person implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean { private String name; private String mobile; public Person() { super(); System.out.println("[构造器] 调用Person的构造器实例化"); } public String getName() { return name; } public void setName(String name) { System.out.println("[属性注入] name="+name); this.name = name; } public String getMobile() { return mobile; } public void setMobile(String mobile) { System.out.println("[属性注入] mobile="+mobile); this.mobile = mobile; } @Override public void destroy() throws Exception { System.out.println("[接口DisposableBean.destroy() ]"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("[接口InitializingBean.afterPropertiesSet() ]"); } @Override public void setBeanName(String name) { System.out.println("[接口BeanNameAware.setBeanName() ]"); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("[接口BeanFactoryAware.setBeanFactory() ]"); } public void myInit(){ System.out.println("[init-method]调用<bean>的init-method属性指定的初始化方法"); } public void myDestory() { System.out.println("[destroy-method]调用<bean>的destroy-method属性指定的销毁方法"); }}2.自定义工厂后处理器,复写postProcessBeanFactory方法,获取bean定义后添加属性mobile=110
3.自定义Bean后处理器,复写postProcessBeforeInitialization和postProcessAfterInitialization2个方法,分别对应初始化前后时的操作。
4.自定义实例化bean后处理器适配器,复写postProcessBeforeInstantiation、postProcessBeforeInstantiation、postProcessPropertyValues分别对应实例化Bean前调用、实例化Bean后调用、设置某个属性时调用
注意:InstantiationAwareBeanPostProcessorAdapter ,这里是实例化Instantiation,不是初始化Initialization!!!
5.测试类,使用ClassPathXmlApplicationContext从xml中读取bean配置文件生成applicationContext容器应用上下文,这一步对应容器初始化。第二部从应用上下文中获取bean。最后一步注册一个关闭钩子,在容器关闭时触发。
直接运行,结果如下:
=============容器初始化======start=========log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).log4j:WARN Please initialize the log4j system properly.[MyBeanFactoryPostProcessor工厂后处理器]BeanFactoryPostProcessor实现类构造器!![MyBeanFactoryPostProcessor工厂后处理器]BeanFactoryPostProcessor.postProcessBeanFactory()获取bean定义后添加属性mobile=110这是BeanPostProcessor实现类构造器!!这是InstantiationAwareBeanPostProcessorAdapter实现类构造器!!InstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation方法[实例化Bean之前调用 ]beanname=person[构造器] 调用Person的构造器实例化InstantiationAwareBeanPostProcessor调用postProcessPropertyValues方法 pvs=PropertyValues: length=2; bean property 'mobile'; bean property 'name',beanName=person[属性注入] mobile=110[属性注入] name=张三[接口BeanNameAware.setBeanName() ][接口BeanFactoryAware.setBeanFactory() ]BeanPostProcessor接口方法postProcessBeforeInitialization对属性进行更改!beanName=person[接口InitializingBean.afterPropertiesSet() ][init-method]调用<bean>的init-method属性指定的初始化方法BeanPostProcessor接口方法postProcessAfterInitialization对属性进行更改!beanName=personInstantiationAwareBeanPostProcessor调用postProcessAfterInitialization方法[实例化Bean之后调用]beanname=person=============容器初始化=======end=====================获取person bean====start====================获取person bean====end=======,person类名=spring.ioc.Person=============注册关闭钩子,关闭容器(JVM shutdown)时触发钩子!================[接口DisposableBean.destroy() ][destroy-method]调用<bean>的destroy-method属性指定的销毁方法总结流程:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1.SpringIOC容器可以管理bean的生命周期,Spring允许在bean生命周期内特定的时间点执行指定的任务。2.SpringIOC容器对bean的生命
基本概念Spring中的Bean的生命周期,指的是Bean从创建到销毁的过程。下面来探究下几个有关Bean生命周期配置的属性。lazy-initlazy-ini
IoC容器负责管理容器中所有bean的生命周期,而在bean生命周期的不同阶段,Spring提供了不同的扩展点来改变bean的命运.在容器的启动阶段,BeanF
Bean的生命周期:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁Bean的定义Bean是spring装配的组件模型,一切实体类都可以配
1.以ApplocationContext上下文单例模式装配bean为例,深入探讨bean的生命周期:(1).生命周期图:(2).具体事例:person类实现B