Spring源碼學(xué)習(xí)03

Spring Bean的生命周期

  1. 在創(chuàng)建bean的時候,指定init和detroy方法.

    package com.wzl.yanyan.spring01.beanlifecycle;
    
    public class Car {
    
        public Car(){
            System.out.println("this is constructor method...");
        }
    
        public void init(){
            System.out.println("this car init method....");
        }
    
        public void destroy(){
            System.out.println("this is car destroy method...");
        }
    }
    
    
package com.wzl.yanyan.spring01.config;

import com.wzl.yanyan.spring01.beanlifecycle.Car;
import org.springframework.context.annotation.Bean;

public class MainConfig4 {

    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Car beanLifeCycle(){
        return new Car();
    }
}
  1. 指定initMethod,detroyMethod.
package com.wzl.yanyan.spring01.beanlifecycle;

import org.springframework.beans.factory.InitializingBean;

public class Shape implements InitializingBean {

    public Shape(){
        System.out.println("這是shape類的無參構(gòu)造器");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("執(zhí)行 初始化bean的方法");
    }
}

package com.wzl.yanyan.spring01.config;

import com.wzl.yanyan.spring01.beanlifecycle.Shape;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;

public class MainConfig5 {

//    @Scope("p")
    @Bean
    public Shape initBean(){
        return new Shape();
    }

}

  1. 實現(xiàn)DisposableBean接口,在容器關(guān)閉時,自動調(diào)用方法

    package com.wzl.yanyan.spring01.beanlifecycle;
    
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    
    public class Shape implements InitializingBean, DisposableBean {
    
        public Shape(){
            System.out.println("這是shape類的無參構(gòu)造器");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("執(zhí)行 初始化bean的方法");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("this shape bean is destroy method");
        }
    }
    
    

第三中方法 通過注解的方式,在bean實例化,并且屬性賦值之后,執(zhí)行的方法.@PreDestroy注解和@PostConstruct注解

  • @PreDestroy和@PostConstruct注解,屬于javaEE的規(guī)范.注解位于 java.xml.ws.annotation包是Java EE的模塊的一部分。J2EE已經(jīng)在Java 9中被棄用饭庞,并且計劃在Java 11中刪除它旺罢。關(guān)注 JSR250規(guī)范,參考連接

Spring 還提供了第四種Java,處理java的生命周期的處理器.

  • 處理器,BeanPostProcessor接口
  • 在Bean的初始化的前后,進(jìn)行一些操作.
  • 接口有二個方法,postProcessBeforeInitialization在任何初始化方法調(diào)用之前,調(diào)用這個方法.比如在調(diào)用PostConstruct初始化方法,或者調(diào)用init-method初始化方法.
  • postProcessAfterInitialization 方法是在初始化方法調(diào)用結(jié)束之后調(diào)用這個方法.

Spring 源碼查看

  1. 為什么實現(xiàn)了BeanPostProcessor類的postProcessBeforInitiallization,能夠在Bean初始化之前,調(diào)用這個方法.弄清楚這個問題,需要查看spring的源碼.查看類,AbstractAutowireCapableBeanFactory中的方法,initializeBean,其中調(diào)用了方法applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName),這個方法就是自定義的postProcessBeforInitiallization.接下來會執(zhí)行語句:

    invokeInitMethods(beanName, wrappedBean, mbd);
    

    invokeInitMethods方法就是進(jìn)行組件初始化賦值的方法.查看后續(xù)語句:

    if (mbd == null || !mbd.isSynthetic()) {
             wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
         }
    

    applyBeanPostProcessorsAfterInitialization方法,即方法postProcessAfterInitialization ,在Bean初始化之后調(diào)用.接著查看applyBeanPostProcessorsBeforeInitialization方法:

    @Override
     public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
             throws BeansException {
    
         Object result = existingBean;
         for (BeanPostProcessor processor : getBeanPostProcessors()) {
             Object current = processor.postProcessBeforeInitialization(result, beanName);
             if (current == null) {
                 return result;
             }
             result = current;
         }
         return result;
     }
    

    查看方法applyBeanPostProcessorsAfterInitialization:

    @Override
     public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
             throws BeansException {
    
         Object result = existingBean;
         for (BeanPostProcessor processor : getBeanPostProcessors()) {
             Object current = processor.postProcessAfterInitialization(result, beanName);
             if (current == null) {
                 return result;
             }
             result = current;
         }
         return result;
     }
    

    遍歷組件中,所有的postProcessBeforinitiallization,初始化前置處理器,便利組件中,所有的applyBeanPostProcessorsAfterInitialization,初始化后置處理器.注意,如果其中有一個方法返回null,整個方法就會停止執(zhí)行

    在執(zhí)行initializeBean這個方法之前,會執(zhí)行populateBean(beanName, mbd, instanceWrapper);這個方法.populateBean這個方法的作用是給熟悉進(jìn)行賦值

研究一下 BeanPostProcessor這個類.

  1. spring 底層對BeanPostProcessor的使用.
    • Bean的賦值,使用了BeanPostProcessor.
    • AutoWired 注解
    • 生命周期注解
    • @Aysnc,xxx等
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痴脾,一起剝皮案震驚了整個濱河市纬纪,隨后出現(xiàn)的幾起案子菌羽,更是在濱河造成了極大的恐慌升略,老刑警劉巖衷蜓,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異判呕,居然都是意外死亡倦踢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門侠草,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辱挥,“玉大人,你說我怎么就攤上這事边涕∥畹猓” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵功蜓,是天一觀的道長园爷。 經(jīng)常有香客問我,道長式撼,這世上最難降的妖魔是什么童社? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮著隆,結(jié)果婚禮上扰楼,老公的妹妹穿的比我還像新娘。我一直安慰自己美浦,他們只是感情好弦赖,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浦辨,像睡著了一般蹬竖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荤牍,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天案腺,我揣著相機與錄音庆冕,去河邊找鬼康吵。 笑死,一個胖子當(dāng)著我的面吹牛访递,可吹牛的內(nèi)容都是我干的晦嵌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惭载!你這毒婦竟也來了旱函?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤描滔,失蹤者是張志新(化名)和其女友劉穎棒妨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體含长,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡券腔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拘泞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纷纫。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖陪腌,靈堂內(nèi)的尸體忽然破棺而出辱魁,到底是詐尸還是另有隱情,我是刑警寧澤诗鸭,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布染簇,位于F島的核電站,受9級特大地震影響强岸,放射性物質(zhì)發(fā)生泄漏剖笙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一请唱、第九天 我趴在偏房一處隱蔽的房頂上張望弥咪。 院中可真熱鬧,春花似錦十绑、人聲如沸聚至。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扳躬。三九已至,卻和暖如春甚亭,著一層夾襖步出監(jiān)牢的瞬間贷币,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工亏狰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留役纹,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓暇唾,卻偏偏與公主長得像促脉,于是被迫代替她去往敵國和親辰斋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355