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


    目录

    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 id="beanLife" class="com.power.node.spring6.bean.BeanLifeCycle" init-method="initMethod"
    2. destroy-method="destroyMethod">
    3. <property name="name" value="bean_name"/>
    4. 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 id="beanLife" class="com.power.node.spring6.bean.BeanLifeCycle" init-method="initMethod"
    2. destroy-method="destroyMethod">
    3. <property name="name" value="bean_name"/>
    4. bean>
    5. <bean id="myInstantiationAwareBeanPostProcessor"
    6. class="com.power.node.spring6.bean.MyInstantiationAwareBeanPostProcessor"/>
    7. 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 id="beanLife" class="com.power.node.spring6.bean.BeanLifeCycle" init-method="initMethod"
    2. destroy-method="destroyMethod">
    3. <property name="name" value="bean_name"/>
    4. bean>
    5. <bean id="myInstantiationAwareBeanPostProcessor"
    6. class="com.power.node.spring6.bean.MyInstantiationAwareBeanPostProcessor"/>
    7. <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

  • 相关阅读:
    nodejs+vue+elementui在线日程管理系统php java python
    C++跳表的简单实现
    二手交易平台碳减排,有了评估标准
    keycloak~从login-status-iframe页面总结如何跨域传值~续
    面试被问答3-5年职业规划,该怎么回答
    目标检测YOLO实战应用案例100讲-基于YOLOv5的航拍图像旋转目标检测
    JavaScript事件流:深入理解事件处理和传播机制
    java 企业工程管理系统软件源码 自主研发 工程行业适用
    linux-配置服务器之间 ssh免密登录
    【American English】美语的连读规则
  • 原文地址:https://blog.csdn.net/weixin_39519454/article/details/127658671