• Spring之bean的生命周期


    目录

    一、Bean的初始化过程

     Spring Bean的生命周期

    二、单例模式与多例模式

    单例模式优点

    单例模式弊端

    单例模式与多例模式的区别


    一、Bean的初始化过程

    Spring Bean的生命周期:

    1、通过三种方式(配置文件、注解、配类) 将bean标签转为BeanDefinitionReader对象

    2、通过BeanFactoryPostProcessor可以在初始化之前修改属性值

    3、BeanFactory进行bean实例化,说白了就是生产javabean

    4、Aware感知接口,能够在拿到Spring上下文中内部的资源对象

    5、BeanPostProcessor后置处理器,相当于环绕通知

    二、单例模式与多例模式

    单例模式优点:

            假设一个类被使用了100次,而这个项目共有1w个类,那么Spring上下文要创建100w个对象,而单例模式可以让Spring上下文创建的对象只有1w个,因此单例模式可以节省空间

     单例模式弊端:

    会污染变量

    那为什么Spring框架的作者要提供原型/多例模式Javabean管理模式进行选择?

    单例模式与多例模式的区别:

    spring-context.xml

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:aop="http://www.springframework.org/schema/aop"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    6. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    8. <bean class="com.zsx.biz.impl.UserBizImpl" id="userbiz" scope="singleton">bean>
    9. <bean class="com.zsx.web.UserAction" id="userAction">
    10. <property name="userbiz" ref="userbiz">property>
    11. <property name="name" value="zsx">property>
    12. <property name="age" value="18">property>
    13. <property name="hobby">
    14. <list>
    15. <value>value>
    16. <value>value>
    17. <value>原神value>
    18. list>
    19. property>
    20. bean>
    21. <bean class="com.zsx.web.OrderAction" id="orderAction">
    22. <property name="userbiz" ref="userbiz">property>
    23. <constructor-arg name="name" value="zsx">constructor-arg>
    24. <constructor-arg name="age" value="18">constructor-arg>
    25. <constructor-arg name="hobby">
    26. <list>
    27. <value>value>
    28. <value>value>
    29. <value>原神value>
    30. list>
    31. constructor-arg>
    32. bean>
    33. <bean class="com.zsx.aop.biz.impl.BookBizImpl" id="bookBiz">bean>
    34. <bean class="com.zsx.aop.advice.MyAdvice" id="myBefore">bean>
    35. <bean class="com.zsx.aop.advice.MyAfterAdvice" id="myAfter">bean>
    36. <bean class="com.zsx.aop.advice.MyInterAdvice" id="myInter">bean>
    37. <bean class="com.zsx.aop.advice.MyThrowsAdvice" id="myThorw">bean>
    38. <bean class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" id="myAfter2">
    39. <property name="advice" ref="myAfter">property>
    40. <property name="pattern" value=".*buy">property>
    41. bean>
    42. <bean class="org.springframework.aop.framework.ProxyFactoryBean" id="bookProxy">
    43. <property name="target" ref="bookBiz">property>
    44. <property name="proxyInterfaces">
    45. <list>
    46. <value>com.zsx.aop.biz.BookBizvalue>
    47. list>
    48. property>
    49. <property name="interceptorNames">
    50. <list>
    51. <value>myBeforevalue>
    52. <value>myIntervalue>
    53. <value>myThorwvalue>
    54. <value>myAfter2value>
    55. list>
    56. property>
    57. bean>
    58. <bean id="paramAction" class="com.zsx.beanLife.ParamAction">
    59. <constructor-arg name="name" value="三丰">constructor-arg>
    60. <constructor-arg name="age" value="21">constructor-arg>
    61. <constructor-arg name="hobby">
    62. <list>
    63. <value>抽烟value>
    64. <value>烫头value>
    65. <value>大保健value>
    66. list>
    67. constructor-arg>
    68. bean>
    69. <bean id="instanceFactory" class="com.zsx.beanLife.InstanceFactory"
    70. scope="singleton" init-method="init" destroy-method="destroy">bean>
    71. beans>

    InstanceFactory

    1. package com.zsx.beanLife;
    2. /**
    3. * 为了印证BeanPostProcessor 初始化javabean
    4. * @author Administrator
    5. *
    6. */
    7. public class InstanceFactory {
    8. public void init() {
    9. System.out.println("初始化方法");
    10. }
    11. public void destroy() {
    12. System.out.println("销毁方法");
    13. }
    14. public void service() {
    15. System.out.println("业务方法");
    16. }
    17. }

     

    ParamAction

    1. package com.zsx.beanLife;
    2. import java.util.List;
    3. /**
    4. * 印证单例、多例的区别
    5. * @author Administrator
    6. *
    7. */
    8. public class ParamAction {
    9. private int age;
    10. private String name;
    11. private List hobby;
    12. private int num = 1;
    13. // private UserBiz userBiz = new UserBizImpl1();
    14. public ParamAction() {
    15. super();
    16. }
    17. public ParamAction(int age, String name, List hobby) {
    18. super();
    19. this.age = age;
    20. this.name = name;
    21. this.hobby = hobby;
    22. }
    23. public void execute() {
    24. // userBiz.upload();
    25. // userBiz = new UserBizImpl2();
    26. System.out.println("this.num=" + this.num++);
    27. System.out.println(this.name);
    28. System.out.println(this.age);
    29. System.out.println(this.hobby);
    30. }
    31. }

    Demo2

    1. package com.zsx.beanLife;
    2. import org.junit.Test;
    3. import org.springframework.beans.factory.BeanFactory;
    4. import org.springframework.beans.factory.xml.XmlBeanFactory;
    5. import org.springframework.context.ApplicationContext;
    6. import org.springframework.context.support.ClassPathXmlApplicationContext;
    7. import org.springframework.core.io.ClassPathResource;
    8. import org.springframework.core.io.Resource;
    9. /*
    10. * spring bean的生命週期
    11. * spring bean的單例多例
    12. */
    13. public class Demo2 {
    14. // 体现单例与多例的区别
    15. @Test
    16. public void test1() {
    17. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-context.xml");
    18. // ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-context.xml");
    19. //ParamAction p1 = (ParamAction) applicationContext.getBean("paramAction");
    20. //ParamAction p2 = (ParamAction) applicationContext.getBean("paramAction");
    21. InstanceFactory p1 = (InstanceFactory) applicationContext.getBean("instanceFactory");
    22. InstanceFactory p2 = (InstanceFactory) applicationContext.getBean("instanceFactory");
    23. // System.out.println(p1==p2);
    24. // p1.execute();
    25. // p2.execute();
    26. // 单例时,容器销毁instanceFactory对象也销毁;多例时,容器销毁对象不一定销毁;
    27. applicationContext.close();
    28. }
    29. // 体现单例与多例的初始化的时间点 instanceFactory
    30. @Test
    31. public void test2() {
    32. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-context.xml");
    33. }
    34. // BeanFactory会初始化bean对象,但会根据不同的实现子类采取不同的初始化方式
    35. // 默认情况下bean的初始化,单例模式立马会执行,但是此时XmlBeanFactory作为子类,单例模式下容器创建,bean依赖没有初始化,只有要获取使用bean对象才进行初始化
    36. @Test
    37. public void test3() {
    38. // ClassPathXmlApplicationContext applicationContext = new
    39. // ClassPathXmlApplicationContext("/spring-context.xml");
    40. Resource resource = new ClassPathResource("/spring-context.xml");
    41. BeanFactory beanFactory = new XmlBeanFactory(resource);
    42. //InstanceFactory i1 = (InstanceFactory) beanFactory.getBean("instanceFactory");
    43. }
    44. }

     Debug运行Demo2中的text1(这是单例模式下的)

      Debug运行Demo2中的text3  这是多例模式下的) 没启用最后一行代码,初始化都不会出来

     放出Demo2中的text3中的最后一行代码  然后再运行

    1. @Test
    2. public void test3() {
    3. // ClassPathXmlApplicationContext applicationContext = new
    4. // ClassPathXmlApplicationContext("/spring-context.xml");
    5. Resource resource = new ClassPathResource("/spring-context.xml");
    6. BeanFactory beanFactory = new XmlBeanFactory(resource);
    7. InstanceFactory i1 = (InstanceFactory) beanFactory.getBean("instanceFactory");
    8. }

    放出后会初始化方法,但最终不会摧毁方法

     

     

    单例模式下javabean的生命周期

                    容器生对象生,  容器死对象死

    多例模式下javabean的生命周期

                    使用时对象生,死亡跟着jvm垃圾回收机制走

    bean的初始化时间点,除了跟bean管理模式(单例/多例)有关,还跟BeanFactory的子类有关

  • 相关阅读:
    如何在 Rocky Linux 上安装 Apache Kafka?
    MATLAB中uiresume函数用法
    TouchGFX界面开发 | 按钮控件应用示例
    华为OD机试 - 计算面积 - 逻辑分析(Java 2023 B卷 100分)
    springcloudgateway 默认转发不生效
    petalinux下修改系统空间笔记
    vue 手势解锁功能
    【scikit-learn基础】--『监督学习』之 空间聚类
    opencv之 drawContours() 函数说明应用
    java常见类的方法和使用
  • 原文地址:https://blog.csdn.net/weixin_61523879/article/details/126232956