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

此博客為學(xué)習(xí)筆記,記錄下來怕自己后面學(xué)著學(xué)著忘記了。
簡書內(nèi)容同步更新,id同名,本文csdn鏈接
在上一篇文章中記錄了Spring Bean中的配置屬性+實(shí)例化+作用域,此文將Spring Bean的補(bǔ)充生命周期。
這是上篇鏈接:Spring5基礎(chǔ)(3)——Spring Bean(配置屬性+實(shí)例化+作用域)

Spring Bean生命周期

一個對象在生命周期中會有實(shí)例化,初始化,使用對象,銷毀等過程,Spring Bean也是對象,只是Spring提供一些接口,使得我們可以在Bean的生命周期中進(jìn)行一些操作。在Spring Bean中實(shí)例化是Bean對象開辟空間,初始化是對屬性的初始化。

Spring容器可管理作用域?yàn)?singleton的 Bean生命周期,而作用域?yàn)閜rototype的Bean則交給了客戶端來管理。

Bean的生命周期過程如下:

  • ① 根據(jù)Bean的配置信息實(shí)例化
  • ②根據(jù)Spring上下文對實(shí)例化的Bean進(jìn)行依賴注入,即對Bean的屬性初始化。
  • ③若Bean實(shí)現(xiàn)了BeanNameAware接口,將調(diào)用它實(shí)現(xiàn)的setBeanName(String beanId)方法,beanid即xml配置文件中Bean的id。
  • ④若Bean實(shí)現(xiàn)了BeanFactory接口,將調(diào)用它實(shí)現(xiàn)的setBeanFactory方法,參數(shù)為當(dāng)前Spring工廠實(shí)例的引用
  • ⑤若Bean實(shí)現(xiàn)了ApplicationContextAware接口,將調(diào)用它實(shí)現(xiàn)的setApplicationContext方法,參數(shù)為當(dāng)前Spring上下文實(shí)例。
  • ⑥若Bean關(guān)聯(lián)了BeanPostProcessor接口,將調(diào)用它實(shí)現(xiàn)的postProcessBeforeInitialization(Object obj,String str)方法,對Bean進(jìn)行操作。在初始化結(jié)束時(即第八點(diǎn)之后)會調(diào)用postProcessBeforeInitialization(Object obj,String str)方法,此方法由于是初始化結(jié)束調(diào)用,因此可用于內(nèi)存或緩存技術(shù)
  • ⑦若Bean實(shí)現(xiàn)了InitializingBean接口,將調(diào)用afterPropertiesSet方法。
  • ⑧若Bean在xml配置文件中配置了init-method屬性,則將調(diào)用該屬性所填寫的初始化方法。
    例如下面例子:設(shè)置配置文件中該Bean的init-method屬性為myInitMethod,Spring IoC容器初始化該Bean的時候就會調(diào)用該類中的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不需要使用時進(jìn)入銷毀階段(IoC容器關(guān)閉后會銷毀對象),若實(shí)現(xiàn)了DisPosable接口,則調(diào)用destroy()方法將Bean銷毀。
  • ⑩若xml配置文件中使用destroy-method屬性指定了特定的Bean銷毀方法,則調(diào)用此屬性對應(yīng)的方法。
    還是剛剛上面那個例子,添加部分代碼如下所示:
    配置文件中:
  <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的銷毀操作
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容