Spring生命周期详解 + 应用实例

Posted 结构化思维wz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring生命周期详解 + 应用实例相关的知识,希望对你有一定的参考价值。

文章目录

Spring Bean的生命周期

创建阶段

  • 调用构造方法
  • 如果bean是单例的,并且没有开启懒加载,那么Spring工厂创建的时候就会创建该对象。
    如果bean是单例的,但是开启了懒加载,在对象第一次使用的时候创建该对象。
    如果bean不是单例的,在使用该对象的时候创建。

初始化阶段

  • Spring工厂在创建完对象后,调用对象的初始化方法,完成对应的初始化开发。
  • 初始化方法提供:程序员提供
  • 初始化方法调用:Spring工厂进行调用。

提供初始化的方法:

  • 实现InitializingBean接口:
    public void afterProperitesSet() //在此方法中做初始化操作

  • 对象中提供一个普通的方法

    public void myInit()
        //Spring 怎么知道要调用呢?? init-method="" 配置
        
    
    
  • 注解 @PostConstruct

几种方法的优先级:

//如果三种初始化方法都提供了
@PostConstruct ---> InitializingBean ----> init-method

注入与初始化的顺序:

注入一定发生在初始化的前面。

Spring创建对象(调构造方法) —> DI —> 初始化

销毁阶段

Spring销毁对象前,会调用对象的销毁方法,完成销毁操作。

  1. Spring什么时候销毁所创建的对象

    ctx.close(); //工厂关闭的时候

  2. 销毁方法是程序员定义的

    调用:Spring调用

  3. 如何定义销毁方法:

    • 实现DisPosableBean接口

      public void destroy()
          //完成销毁操作(资源释放)
      
      
    • 普通的销毁方法

      public void myDestroy() throw Exption
          //需要配置 destroyMethod="myDestroy"
      
      
    • @preDestroy

    几种方法的优先级:

    @preDestroy > DisposableBean > destoryMethod

注意:销毁操作只适用于singleton


应用实例

前言:有些时候我们需要在创建对象的时候做一些操作,这时候我们可能会选择在构造方法里进行,但是如果构造方法里需要用到成员变量,而成员变量恰好是配置文件通过@Value注入进来的。这时候因为Spring调用构造方法创建对象的时候成员变量的值还未注入,就会事与愿违。

例如我们在使用Client模拟客户端的时候,会有需要账号密码建立链接的情况。

public TestConnect()
        //获取连接信息
        this.client = Client.create();
        this.client.addFilter(new HTTPBasicAuthFilter(this.UserName, this.Password));
    

这种写法如果被Spring工厂管理,他的成员变量是不能从配置文件中获取到的。(因为Spring创建一个对象是先调用构造方法再注入)

分析发现建立链接的需求,在初始化也可以完成,并且可以获取到配置文件中的值。

@PostConstruct
    public void myInit()
        //获取连接信息
        this.client = Client.create();
        this.client.addFilter(new HTTPBasicAuthFilter(this.UserName, this.Password));
    

以上是关于Spring生命周期详解 + 应用实例的主要内容,如果未能解决你的问题,请参考以下文章

Spring bean的生命周期详解

详解spring——IOC之分析Bean的生命周期

Spring之SpringBean的生命周期详解

Spring Bean生命周期详解

Spring框架系列 - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)

详解Spring中Bean的作用域与生命周期