Spring对象的生命周期

本文阅读 6 分钟
首页 代码,Java 正文

1.对象的生命周期的定义

对象的生命周期指的是一个对象的创建、存活、消亡的一个完整过程

2.为什么要学习对象的生命周期

以前我们写代码的时候,都是自己来new对象 User user=new User(); 当对象被虚拟机的垃圾回收机制回收,它就销毁了 但是现在是由Spring来复杂对象的创建、存活、销毁,了解生命周期,有利于我们使用好Spring为我们创建的对象

3.生命周期的三个阶段

3.1创建阶段

  • 创建阶段 Spring工厂什么时候创建对象呢?
    - 当 scope=“singleton”
      - Spring工厂创建的同时,也会进行对象的创建 - 接下来通过代码来测试
    • 我们先创建一个类来进行测试
      </ul>
    public class Product { 
        public Product() { 
            System.out.println("Product无参构造执行");
        }
    }

    然后在配置文件进行配置

    <bean id="product" class="com.zyh.life.Product"></bean>

    接下来进行测试 img

    • 如果这个时候,我们希望当scope="singleton"的时候,我们也是当获取对象的时候,才创建对象,要怎么做呢?
    • 我们只需要在配置文件中,增加一个属性lazy-init=true
    <bean id="product" class="com.zyh.life.Product" scope="singleton" lazy-init="true"></bean>
    • 当scope=“prototype”
      - 这个时候Spring工厂会在获取对象的时候,创建对象
        - ctx.getBean(" "); - 接下来进行测试 img

      3.2初始化阶段

      • Spring工厂在创建完对象以后,调用对象的初始化方法,完成对应的初始化操作
      • 初始化方法是由程序员提供的,提供初始化方法,来完成初始化操作
      • 初始化方法是由Spring工厂来调用的
        - 为了完成上述功能,我们应该让一个类实现InitializingBean接口,并且实现里面的方法afterPropertiesSet
      public class Product implements InitializingBean { 
          public Product() { 
              System.out.println("Product无参构造执行");
          }
      
          /** * 这个就是初始化方法,做初始化的操作 * 是由Spring来调用 * @throws Exception */
          @Override
          public void afterPropertiesSet() throws Exception { 
              System.out.println("Spring调用afterPropertiesSet方法进行初始化操作");
          }
      }

      img

      • 我们还有第二种方法可以进行初始化操作
        - 对象中提供一个普通的方法
      这个方法的方法名是随便取 的
      public void myInit(){ 
      
      }
      这个方法是由Spring来调用的,但是Spring怎么知道这个方法的存在呢
      这个时候,就需要我们在配置文件中进行配置
      <bean id="product" class="xxx.Product" init-method="myInit"/>

      接下来进行演示

      package com.zyh.life;
      
      import org.springframework.beans.factory.InitializingBean;
      
      /** * @author zengyihong * @create 2022--04--17 13:27 */
      public class Product { 
          public Product() { 
              System.out.println("Product无参构造执行");
          }
          public void myInit(){ 
              System.out.println("自己写的初始化方法");
          }
      
        
      }
      <bean id="product" class="com.zyh.life.Product" init-method="myInit" ></bean>

      img 接下来我们进行细节上的分析

      • 如果一个对象既实现InitializingBean接口,同时又提供普通的初始化方法,那么它们的执行顺序是则怎样的
        - 先执行接口的初始化方法再执行我们写的普通初始化方法
      • 如果类有成员变量,我们想要进行注入,那么初始化和注入的执行顺序又是怎样的呢
        - Spring会先进行成员变量的注入然后才进行初始化
      package com.zyh.life;
      
      import org.springframework.beans.factory.InitializingBean;
      
      /** * @author zengyihong * @create 2022--04--17 13:27 */
      public class Product  implements InitializingBean { 
          private String name;
      
          public String getName() { 
              return name;
          }
      
          public void setName(String name) { 
              System.out.println("Product注入操作");
              this.name = name;
          }
      
          public Product() { 
              System.out.println("Product无参构造执行");
          }
          public void myInit(){ 
              System.out.println("自己写的初始化方法");
          }
      
          /** * 这个就是初始化方法,做初始化的操作 * 是由Spring来调用 * @throws Exception */
          @Override
          public void afterPropertiesSet() throws Exception { 
              System.out.println("Spring调用afterPropertiesSet方法进行初始化操作");
          }
      }

      img img 那么什么是初始化操作呢 初始化操作指的是对资源的初始化:比如数据库 IO 网络

      3.3销毁阶段

      Spring销毁对象前,会调用对象的销毁方法

      • 那么Spring什么时候会销毁所创建的对象呢
        - Spring销毁对象,是在它的工厂关闭的时候 ctx.close();
      • 销毁方法:程序员根据自己的需求,定义销毁方法,完成销毁操作
        - 调用:Spring工厂完成调用
      那么如何定义销毁方法呢,和刚刚对象的初始化阶段类似,我们这里也有两种方法 销毁操作我们可以理解成为资源的释放操作
        - ①实现DisposableBean接口,并且实现里面的destroy方法
      public class Product  implements InitializingBean, DisposableBean{ 
          private String name;
      
          public String getName() { 
              return name;
          }
      
          public void setName(String name) { 
              System.out.println("Product注入操作");
              this.name = name;
          }
      
          public Product() { 
              System.out.println("Product无参构造执行");
          }
          public void myInit(){ 
              System.out.println("自己写的初始化方法");
          }
      
          /** * 这个就是初始化方法,做初始化的操作 * 是由Spring来调用 * @throws Exception */
          @Override
          public void afterPropertiesSet() throws Exception { 
              System.out.println("Spring调用afterPropertiesSet方法进行初始化操作");
          }
      
          @Override
          public void destroy() throws Exception { 
              System.out.println("Spring销毁方法执行");
          }
      }

      img

      • ②定义一个普通的销毁方法,然后在配置文件中进行配置
      public void myDestroy()throws Exception{ 
              System.out.println("自己写的销毁方法");
          }

      在配置文件配置,也就是加上destroy-method

      <bean id="product" class="com.zyh.life.Product" init-method="myInit" destroy-method="myDestroy" >
              <property name="name" value="tom"></property>
          </bean>

      接下来还是进行细节方面的讨论 <font color="red">会先执行Spring的销毁方法,然后才执行我们自己定义的销毁方法 在这里插入图片描述 销毁方法的操作,只适用于scope=“singleton”,对于其他作用域没有作用</font>

      • 销毁操作主要用来资源的释放
      本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://zengyihong.blog.csdn.net/article/details/124228344
-- 展开阅读全文 --
安全面试之XSS(跨站脚本攻击)
« 上一篇 07-24

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复