天天看點

Spring5基礎(4)——Spring Bean(生命周期)

此部落格為學習筆記,記錄下來怕自己後面學着學着忘記了。

簡書内容同步更新,id同名,本文簡書連結

在上一篇文章中記錄了Spring Bean中的配置屬性+執行個體化+作用域,此文将Spring Bean的補充生命周期。

這是上篇連結:Spring5基礎(3)——Spring Bean(配置屬性+執行個體化+作用域)

Spring Bean生命周期

一個對象在生命周期中會有執行個體化,初始化,使用對象,銷毀等過程,Spring Bean也是對象,隻是Spring提供一些接口,使得我們可以在Bean的生命周期中進行一些操作。在Spring Bean中執行個體化是Bean對象開辟空間,初始化是對屬性的初始化。

Spring容器可管理作用域為 singleton的 Bean生命周期,而作用域為prototype的Bean則交給了用戶端來管理。

Bean的生命周期過程如下:

  • ① 根據Bean的配置資訊執行個體化
  • ②根據Spring上下文對執行個體化的Bean進行依賴注入,即對Bean的屬性初始化。
  • ③若Bean實作了BeanNameAware接口,将調用它實作的setBeanName(String beanId)方法,beanid即xml配置檔案中Bean的id。
  • ④若Bean實作了BeanFactory接口,将調用它實作的setBeanFactory方法,參數為目前Spring工廠執行個體的引用。
  • ⑤若Bean實作了ApplicationContextAware接口,将調用它實作的setApplicationContext方法,參數為目前Spring上下文執行個體。
  • ⑥若Bean關聯了BeanPostProcessor接口,将調用它實作的postProcessBeforeInitialization(Object obj,String str)方法,對Bean進行操作。在初始化結束時(即第八點之後)會調用postProcessBeforeInitialization(Object obj,String str)方法,此方法由于是初始化結束調用,是以可用于記憶體或緩存技術
  • ⑦若Bean實作了InitializingBean接口,将調用afterPropertiesSet方法。
  • ⑧若Bean在xml配置檔案中配置了init-method屬性,則将調用該屬性所填寫的初始化方法。

    例如下面例子:設定配置檔案中該Bean的init-method屬性為myInitMethod,Spring IoC容器初始化該Bean的時候就會調用該類中的myInitMethod()方法。

    配置檔案中:

<bean id="C5_2" class="com.lipiao.demo.C" 
                 init-method="myInitMethod">
        <property name="name" value="C_strName_setter"/>
    </bean>
           

該類中:

package com.lipiao.demo;
public class C {
   String name;
   public void setName(String name) {
        this.name = name;
    }
    //自定義的初始化方法
    private void myInitMethod() {
        //該Bean的初始化操作省略
    }
}
           

以上步驟完成之後就到了使用Bean的階段了。

  • ⑨Bean不需要使用時進入銷毀階段(IoC容器關閉後會銷毀對象),若實作了DisPosable接口,則調用destroy()方法将Bean銷毀。
  • ⑩若xml配置檔案中使用destroy-method屬性指定了特定的Bean銷毀方法,則調用此屬性對應的方法。

    還是剛剛上面那個例子,添加部分代碼如下所示:

    配置檔案中:

<bean id="C5_2" class="com.lipiao.demo.C"
          init-method="myInitMethod"
          destroy-method="myDestroyMethod">
        <property name="name" value="C_strName_setter"/>
    </bean>
           

該類中:

package com.lipiao.demo;
public class C {
   String name;
   public void setName(String name) {
        this.name = name;
    }
    //自定義的初始化方法
    private void myInitMethod() {
        //該Bean的初始化操作省略
    }
    //自定義的銷毀方法
    private void myDestroyMethod() {
        //該Bean的銷毀操作
    }
}