飞道的博客

Spring Bean 的生命周期(看着图不迷路)

280人阅读  评论(0)

目录

Bean的生命周期5步走系列:

BeanLifeCycle类

Spring.xml 配置文件

BeanLifeTest测试方法

运行结果:

Bean的生命周期7步走系列:在实例化Bean的前和后加了两步。​​​​

定义myInstantiationAwareBeanPostProcessor 类

实现InstantiationAwareBeanPostProcessor 接口

并将这个类配置到Spring.xml中

复用5步走的测试方法

运行结果:

Bean的生命周期9步系列:在初始化Bean的前和后添加两步。

需要实现BeanPostProcessor接口并重写 Initialization 的两个方法

Spring.xml配置

复用5步走的测试方法

测试结果:

Bean的生命周期10步走系列:比9步多了在属性赋值之后感知

BeanLifeCycle类

复用5步走的测试方法

测试结果:

Bean的生命周期11步走系列:比10步多添加了初始化Bean之前处理的方法。

BeanLifeCycle类

复用5步走的测试方法

测试结果:

Bean的生命周期12步走系列:在销毁Bean之前添加了一步。

BeanLifeCycle类

复用5步走的测试方法

测试结果:



Bean的生命周期5步走系列:

分别是如下图:

BeanLifeCycle类


  
  1. /**
  2. * Bean的生命周期按照粗略的五步的话:
  3. * 第一步:实例化Bean(调用无参数构造方法。)
  4. * 第二步:给Bean属性赋值(调用set方法。)
  5. * 第三步:初始化Bean (会调用Bean的init方法。注意:这个init方法需要自己写,自己配。)
  6. * 第四步:使用Bean
  7. * 第五步:销毁Bean (公调用Bean/destroy方法。注意:这个destroy方法需要自己写,自己配。)
  8. * @Author darren
  9. * @Date 2022/11/2 9:25
  10. */
  11. public class BeanLifeCycle {
  12. private String name;
  13. public BeanLifeCycle () {
  14. System.out.println( "第一步:实例化Bean");
  15. }
  16. public String getName () {
  17. return name;
  18. }
  19. public void setName (final String name) {
  20. System.out.println( "第二步:给Bean属性赋值");
  21. this.name = name;
  22. }
  23. public void initMethod (){
  24. System.out.println( "第三步:初始化Bean");
  25. }
  26. public void destroyMethod (){
  27. System.out.println( "第五步:销毁Bean ");
  28. }
  29. @Override
  30. public String toString () {
  31. return "BeanLifeCycle{" +
  32. "name='" + name + '\'' +
  33. '}';
  34. }
  35. }

Spring.xml 配置文件


  
  1. <!--Bean 的生命周期-->
  2. <bean id="beanLife" class="com.power.node.spring6.bean.BeanLifeCycle" init-method="initMethod"
  3. destroy-method= "destroyMethod">
  4. <property name="name" value="bean_name"/>
  5. </bean>

BeanLifeTest测试方法


  
  1. public class BeanLifeTest {
  2. /**
  3. * Bean的生命周期
  4. */
  5. @Test
  6. public void testBeanLifeCycle (){
  7. ClassPathXmlApplicationContext classPathXmlApplicationContext =
  8. new ClassPathXmlApplicationContext( "beanLife.xml");
  9. BeanLifeCycle beanLife = classPathXmlApplicationContext.getBean( "beanLife", BeanLifeCycle.class);
  10. System.out.println( "第四步:使用Bean "+beanLife.toString());
  11. System.out.println( "");
  12. classPathXmlApplicationContext.close();
  13. }
  14. }

运行结果:


  
  1. 第一步:实例化Bean
  2. 第二步:给Bean属性赋值
  3. 第三步:初始化Bean
  4. 第四步:使用Bean BeanLifeCycle{name= 'bean_name'}
  5. 第五步:销毁Bean

Bean的生命周期7步走系列:在实例化Bean的前和后加了两步。
​​​​

如图:

 

定义myInstantiationAwareBeanPostProcessor 类

实现InstantiationAwareBeanPostProcessor 接口


  
  1. /**
  2. * 实例化前后处理器
  3. * @Author darren
  4. * @Date 2022/11/2 17:16
  5. */
  6. public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
  7. @Override
  8. public Object postProcessBeforeInstantiation (final Class<?> beanClass, final String beanName)
  9. throws BeansException {
  10. System.out.println( " 第1.1步-实例化之前-后期处理器");
  11. return InstantiationAwareBeanPostProcessor. super.postProcessBeforeInstantiation(beanClass,
  12. beanName);
  13. }
  14. @Override
  15. public boolean postProcessAfterInstantiation (final Object bean, final String beanName)
  16. throws BeansException {
  17. System.out.println( " 第1.1步-实例化之后-后期处理器");
  18. System.out.println( "");
  19. return InstantiationAwareBeanPostProcessor. super.postProcessAfterInstantiation(bean,
  20. beanName);
  21. }
  22. }

并将这个类配置到Spring.xml中


  
  1. <!--Bean 的生命周期-->
  2. <bean id="beanLife" class="com.power.node.spring6.bean.BeanLifeCycle" init-method="initMethod"
  3. destroy-method= "destroyMethod">
  4. <property name="name" value="bean_name"/>
  5. </bean>
  6. <!--实例化前后处理器-->
  7. <bean id="myInstantiationAwareBeanPostProcessor"
  8. class= "com.power.node.spring6.bean.MyInstantiationAwareBeanPostProcessor"/>
  9. </beans>

复用5步走的测试方法

运行结果:


  
  1.           第 1.1步-实例化之前-后期处理器
  2.     第一步:实例化Bean
  3.           第 1.2步-实例化之后-后期处理器
  4.     第二步:Bean属性赋值
  5.     第三步:初始化Bean
  6.     第四步:使用Bean
  7.     第五步:销毁Bean
  8. 注意:
  9.     需要实现InstantiationAwareBeanPostProcessor接口并重写Instantiation方法后并配置到xml,
  10.         postProcessBeforeInstantiation:实例化之前-后期处理器
  11.         postProcessAfterInstantiation :实例化之后-后期处理器

Bean的生命周期9步系列:在初始化Bean的前和后添加两步。

 

需要实现BeanPostProcessor接口并重写 Initialization 的两个方法


  
  1. postProcessBeforeInitialization:初始化之前-后期处理器
  2. postProcessAfterInitialization :初始化之后-后期处理器

  
  1. /**
  2. * 初始化前后置处理器
  3. * @Author darren
  4. * @Date 2022/11/2 9:56
  5. */
  6. public class MyBeanPostProcessor implements BeanPostProcessor {
  7. @Override
  8. public Object postProcessBeforeInitialization (final Object bean, final String beanName)
  9. throws BeansException {
  10. System.out.println( " 第3.1步-初始化前的-后期处理器");
  11. return BeanPostProcessor. super.postProcessBeforeInitialization(bean, beanName);
  12. }
  13. @Override
  14. public Object postProcessAfterInitialization (final Object bean, final String beanName)
  15. throws BeansException {
  16. System.out.println( " 第3.2步-初始化后的-后期处理器");
  17. System.out.println( "");
  18. return BeanPostProcessor. super.postProcessAfterInitialization(bean, beanName);
  19. }
  20. }

Spring.xml配置


  
  1. <!--Bean 的生命周期-->
  2. <bean id="beanLife" class="com.power.node.spring6.bean.BeanLifeCycle" init-method="initMethod"
  3. destroy-method= "destroyMethod">
  4. <property name="name" value="bean_name"/>
  5. </bean>
  6. <!--实例化前后处理器-->
  7. <bean id="myInstantiationAwareBeanPostProcessor"
  8. class= "com.power.node.spring6.bean.MyInstantiationAwareBeanPostProcessor"/>
  9. <!--初始化前后置处理器-->
  10. <bean id="myBeanPostProcessor" class="com.power.node.spring6.bean.MyBeanPostProcessor"/>

复用5步走的测试方法

测试结果:


  
  1. 第1.1步-实例化之前-后期处理器
  2. 第一步:实例化Bean
  3. 第1.1步-实例化之后-后期处理器
  4. 第二步:给Bean属性赋值
  5. 第3.1步-初始化前的-后期处理器
  6. 第三步:初始化Bean
  7. 第3.2步-初始化后的-后期处理器
  8. 第四步:使用Bean BeanLifeCycle{name='bean_name'}
  9. 第五步:销毁Bean

Bean的生命周期10步走系列:比9步多了在属性赋值之后感知

如图:

BeanLifeCycle类

需要这个类实现Aware(感知)接口,
    如:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware、ApplicationContextAware
在属性赋值之后感知可以获取或设置下面信息
    BeanName、BeanClassLoader、BeanFactory、ApplicationContext

  
  1. public class BeanLifeCycle implements BeanNameAware, BeanFactoryAware, BeanClassLoaderAware,
  2. ApplicationContextAware {
  3. private String name;
  4. public BeanLifeCycle () {
  5. System.out.println( "第一步:实例化Bean");
  6. }
  7. public String getName () {
  8. return name;
  9. }
  10. public void setName (final String name) {
  11. System.out.println( "第二步:给Bean属性赋值");
  12. this.name = name;
  13. }
  14. @Override
  15. public void setBeanName (final String s) {
  16. System.out.println( " 第2.2步-属性感知-设置属性名称:"+s);
  17. }
  18. @Override
  19. public void setBeanClassLoader (final ClassLoader classLoader) {
  20. System.out.println( " 第2.3步-属性感知-设置类加载器:"+classLoader);
  21. }
  22. @Override
  23. public void setBeanFactory (final BeanFactory beanFactory) throws BeansException {
  24. System.out.println( " 第2.4步-属性感知-设置bean工厂:"+beanFactory);
  25. }
  26. @Override
  27. public void setApplicationContext (final ApplicationContext applicationContext)
  28. throws BeansException {
  29. System.out.println( " 第2.5步-属性感知-设置上下文:"+applicationContext);
  30. System.out.println( "");
  31. }
  32. public void initMethod (){
  33. System.out.println( "第三步:初始化Bean");
  34. }
  35. public void destroyMethod (){
  36. System.out.println( "第五步:销毁Bean ");
  37. }
  38. @Override
  39. public String toString () {
  40. return "BeanLifeCycle{" +
  41. "name='" + name + '\'' +
  42. '}';
  43. }
  44. }

复用5步走的测试方法

测试结果:


  
  1. 1.1步-实例化之前-后期处理器
  2. 第一步:实例化Bean
  3. 1.1步-实例化之后-后期处理器
  4. 第二步:给Bean属性赋值
  5. 2.2步-属性感知-设置属性名称:beanLife
  6. 2.3步-属性感知-设置类加载器:jdk.internal.loader.ClassLoaders$AppClassLoader@78308db1
  7. 2.4步-属性感知-设置bean工厂:org.springframework.beans.factory.support.DefaultListableBeanFactory@5812f68b: defining beans [beanLife,myInstantiationAwareBeanPostProcessor,myBeanPostProcessor]; root of factory hierarchy
  8. 2.5步-属性感知-设置上下文:org.springframework.context.support.ClassPathXmlApplicationContext@29f7cefd, started on Wed Nov 02 21: 11: 42 CST 2022
  9. 3.1步-初始化前的-后期处理器
  10. 第三步:初始化Bean
  11. 3.2步-初始化后的-后期处理器
  12. 第四步:使用Bean BeanLifeCycle{name= 'bean_name'}
  13. 第五步:销毁Bean

Bean的生命周期11步走系列:比10步多添加了初始化Bean之前处理的方法。

如图:

BeanLifeCycle类

需要这个类实现InitializingBean接口,重写afterPropertiesSet方法

  
  1. public class BeanLifeCycle implements BeanNameAware, BeanFactoryAware, BeanClassLoaderAware,
  2. ApplicationContextAware, InitializingBean {
  3. private String name;
  4. public BeanLifeCycle () {
  5. System.out.println( "第一步:实例化Bean");
  6. }
  7. public String getName () {
  8. return name;
  9. }
  10. public void setName (final String name) {
  11. System.out.println( "第二步:给Bean属性赋值");
  12. this.name = name;
  13. }
  14. @Override
  15. public void setBeanName (final String s) {
  16. System.out.println( " 第2.2步-属性感知-设置属性名称:"+s);
  17. }
  18. @Override
  19. public void setBeanClassLoader (final ClassLoader classLoader) {
  20. System.out.println( " 第2.3步-属性感知-设置类加载器:"+classLoader);
  21. }
  22. @Override
  23. public void setBeanFactory (final BeanFactory beanFactory) throws BeansException {
  24. System.out.println( " 第2.4步-属性感知-设置bean工厂:"+beanFactory);
  25. }
  26. @Override
  27. public void setApplicationContext (final ApplicationContext applicationContext)
  28. throws BeansException {
  29. System.out.println( " 第2.5步-属性感知-设置上下文:"+applicationContext);
  30. System.out.println( "");
  31. }
  32. @Override
  33. public void afterPropertiesSet () throws Exception {
  34. System.out.println( " 第3.1.1步-初始化之前调用");
  35. }
  36. public void initMethod (){
  37. System.out.println( "第三步:初始化Bean");
  38. }
  39. public void destroyMethod (){
  40. System.out.println( "第五步:销毁Bean ");
  41. }
  42. @Override
  43. public String toString () {
  44. return "BeanLifeCycle{" +
  45. "name='" + name + '\'' +
  46. '}';
  47. }
  48. }

复用5步走的测试方法

测试结果:


  
  1. 1.1步-实例化之前-后期处理器
  2. 第一步:实例化Bean
  3. 1.1步-实例化之后-后期处理器
  4. 第二步:给Bean属性赋值
  5. 2.2步-属性感知-设置属性名称:beanLife
  6. 2.3步-属性感知-设置类加载器:jdk.internal.loader.ClassLoaders$AppClassLoader@78308db1
  7. 2.4步-属性感知-设置bean工厂:org.springframework.beans.factory.support.DefaultListableBeanFactory@5812f68b: defining beans [beanLife,myInstantiationAwareBeanPostProcessor,myBeanPostProcessor]; root of factory hierarchy
  8. 2.5步-属性感知-设置上下文:org.springframework.context.support.ClassPathXmlApplicationContext@29f7cefd, started on Wed Nov 02 21: 11: 42 CST 2022
  9. 3.1步-初始化前的-后期处理器
  10. 3.1 .1步-初始化之前调用
  11. 第三步:初始化Bean
  12. 3.2步-初始化后的-后期处理器
  13. 第四步:使用Bean BeanLifeCycle{name= 'bean_name'}
  14. 第五步:销毁Bean

Bean的生命周期12步走系列:在销毁Bean之前添加了一步。

如图:

 

BeanLifeCycle类

需要这个类实现DisposableBean接口,并重写destroy方法,调用时机是在指定destroy-method 之前调用

  
  1. public class BeanLifeCycle implements BeanNameAware, BeanFactoryAware, BeanClassLoaderAware,
  2. ApplicationContextAware, InitializingBean, DisposableBean {
  3. private String name;
  4. public BeanLifeCycle () {
  5. System.out.println( "第一步:实例化Bean");
  6. }
  7. public String getName () {
  8. return name;
  9. }
  10. public void setName (final String name) {
  11. System.out.println( "第二步:给Bean属性赋值");
  12. this.name = name;
  13. }
  14. @Override
  15. public void setBeanName (final String s) {
  16. System.out.println( " 第2.2步-属性感知-设置属性名称:"+s);
  17. }
  18. @Override
  19. public void setBeanClassLoader (final ClassLoader classLoader) {
  20. System.out.println( " 第2.3步-属性感知-设置类加载器:"+classLoader);
  21. }
  22. @Override
  23. public void setBeanFactory (final BeanFactory beanFactory) throws BeansException {
  24. System.out.println( " 第2.4步-属性感知-设置bean工厂:"+beanFactory);
  25. }
  26. @Override
  27. public void setApplicationContext (final ApplicationContext applicationContext)
  28. throws BeansException {
  29. System.out.println( " 第2.5步-属性感知-设置上下文:"+applicationContext);
  30. System.out.println( "");
  31. }
  32. @Override
  33. public void afterPropertiesSet () throws Exception {
  34. System.out.println( " 第3.1.1步-初始化之前调用");
  35. }
  36. public void initMethod (){
  37. System.out.println( "第三步:初始化Bean");
  38. }
  39. @Override
  40. public void destroy () throws Exception {
  41. System.out.println( " 第5.1步-销毁-在destroy-method 之前调用");
  42. }
  43. public void destroyMethod (){
  44. System.out.println( "第五步:销毁Bean ");
  45. }
  46. @Override
  47. public String toString () {
  48. return "BeanLifeCycle{" +
  49. "name='" + name + '\'' +
  50. '}';
  51. }
  52. }

复用5步走的测试方法

测试结果:


  
  1. 1.1步-实例化之前-后期处理器
  2. 第一步:实例化Bean
  3. 1.1步-实例化之后-后期处理器
  4. 第二步:给Bean属性赋值
  5. 2.2步-属性感知-设置属性名称:beanLife
  6. 2.3步-属性感知-设置类加载器:jdk.internal.loader.ClassLoaders$AppClassLoader@78308db1
  7. 2.4步-属性感知-设置bean工厂:org.springframework.beans.factory.support.DefaultListableBeanFactory@5812f68b: defining beans [beanLife,myInstantiationAwareBeanPostProcessor,myBeanPostProcessor]; root of factory hierarchy
  8. 2.5步-属性感知-设置上下文:org.springframework.context.support.ClassPathXmlApplicationContext@29f7cefd, started on Wed Nov 02 21: 11: 42 CST 2022
  9. 3.1步-初始化前的-后期处理器
  10. 3.1 .1步-初始化之前调用
  11. 第三步:初始化Bean
  12. 3.2步-初始化后的-后期处理器
  13. 第四步:使用Bean BeanLifeCycle{name= 'bean_name'}
  14. 5.1步-销毁-在destroy-method 之前调用
  15. 第五步:销毁Bean


转载:https://blog.csdn.net/weixin_39519454/article/details/127658671
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场