深入理解Spring中Bean的生命周期

Bean的執(zhí)行流程圖

Spring中Bean 的完整生命周期,在學(xué)習(xí)Spring 框架的時候剃斧,理解Spring的Bean的管理的非常重要,下圖是Spring的Bean構(gòu)造的全過程:

image

Bean 的生命周期

  1. Spring啟動,查找并加載需要被Spring管理的bean燥滑,進行Bean的實例化

  2. Bean實例化后對將Bean屬性注入值

  3. 如果Bean實現(xiàn)了BeanNameAware接口的話,Spring將調(diào)用setBeanName()方法香罐,將Bean的id 傳進來

  4. 如果Bean實現(xiàn)了BeanFactoryAware接口的話卧波,Spring將調(diào)用setBeanFactory()方法,將BeanFactory容器實例傳進來

  5. 如果Bean實現(xiàn)了ApplicationContextAware接口的話庇茫,Spring將調(diào)用Bean的setApplicationContext()方法港粱,將bean所在應(yīng)用上下文引用傳進來。

  6. 如果Bean實現(xiàn)了BeanPostProcessor接口旦签,Spring就將調(diào)用他們的BeanPostProcessor.postProcessBeforeInitialization()方法

  7. 如果Bean中方法標注注解@PostConstruct查坪,就執(zhí)行該方法

  8. 如果Bean 實現(xiàn)了InitializingBean接口,Spring將調(diào)用他們的InitializingBean.afterPropertiesSet()方法宁炫。同時偿曙,如果bean使用init-method聲明了初始化方法,該方法也會被調(diào)用

  9. 如果Bean 實現(xiàn)了BeanPostProcessor接口羔巢,Spring就將調(diào)用他們的BeanPostProcessor.postProcessAfterInitialization()()方法望忆。這時,Bean已經(jīng)準備創(chuàng)建完成了竿秆。他們將一直存在應(yīng)用上下文中启摄,直到應(yīng)用上下文被銷毀。

  10. 如果Bean中方法標注注解@PreDestroy幽钢,就執(zhí)行該方法

  11. 如果bean實現(xiàn)了DisposableBean接口鞋仍,Spring將調(diào)用它的destory()接口方法,同樣搅吁,如果bean使用了destory-method 聲明銷毀方法威创,該方法也會被調(diào)用。

代碼實例驗證Bean 的生命周期

User 類谎懦,實現(xiàn)BeanNameAware肚豺,BeanFactoryAware,ApplicationContextAware界拦,InitializingBean吸申,DisposableBean接口

public class User implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {

    private String userName;

    public User() {
        System.out.println("User 被實例化!O淼椤=夭辍!");
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        System.out.println("阿福聊聊編程r韧日丹!");
        this.userName = userName;
    }

    public void init() {
        System.out.println("執(zhí)行initMethod方法!r窍印哲虾!");
    }

    @PostConstruct
    public void postContruct() {
        System.out.println("執(zhí)行@PostConstruct方法");
    }

    public void destory1() {
        System.out.println("執(zhí)行destroyMethod方法1铩!J铡晒旅!");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("執(zhí)行@PreDestroy 方法!M羲摺7狭怠!");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("執(zhí)行InitializingBean.afterPropertiesSet()");
    }

    public void destroy() throws Exception {
        System.out.println("DisposableBean.destroy()");
    }

    public void setBeanName(String name) {
        System.out.println("BeanNameAware.setBeanName()" + "--->BeanName:" + name);
    }

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("BeanFactoryAware.setBeanFactory()");
    }

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("ApplicationContextAware.setApplicationContext()" );
    }
}

定義后置處理器MyBeanPostProcessor扒寄,實現(xiàn)postProcessBeforeInitialization拴签,postProcessAfterInitialization的方法

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("MyBeanPostProcessor.postProcessBeforeInitialization()--before->"+"初始化beanName:"+beanName);
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("MyBeanPostProcessor.postProcessAfterInitialization()--after-->"+"初始化beanName:"+beanName);
        return bean;
    }
}

定義MyConfigUser,將User ,MyBeanPostProcessor 注冊到Spring容器當(dāng)中旗们,關(guān)于Bean注冊參考SpringIOC匯總

@ComponentScan(basePackages = "zfcoding.beanpostprocessor")
@Configuration
public class MyConfigUser {

    @Bean(initMethod = "init",destroyMethod = "destory1")
    public User user(){
        return  new User();
    }
}

單元測試

public class BeanProcessTest {
    @Test
    public void test(){
        AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(MyConfigUser.class);
        User user = applicationContext.getBean(User.class);
        applicationContext.close();
    }
}

運行結(jié)果:

User 被實例化r玖ā!I峡省岸梨!
BeanNameAware.setBeanName()--->BeanName:user
BeanFactoryAware.setBeanFactory()
ApplicationContextAware.setApplicationContext()
MyBeanPostProcessor.postProcessBeforeInitialization()--before->初始化beanName:user
執(zhí)行@PostConstruct方法
執(zhí)行InitializingBean.afterPropertiesSet()
執(zhí)行initMethod方法!3淼曹阔!
執(zhí)行@PreDestroy 方法!8襞T叻荨!
DisposableBean.destroy()
執(zhí)行destroyMethod方法I菝住Wズ!鬓长!

文章參考:https://www.cnblogs.com/javazhiyin/p/10905294.html

以上就是Spring Bean 創(chuàng)建的全過程谒拴,完事。

我是阿福涉波,公眾號「阿福聊編程」作者英上,對后端技術(shù)保持學(xué)習(xí)愛好者,我會經(jīng)常更新JAVA技術(shù)文章啤覆,在進階的路上苍日,共勉!

歡迎大家關(guān)注我的公眾號窗声,后臺回復(fù)666相恃,領(lǐng)取Java全套進階實戰(zhàn)課程。

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫌佑,一起剝皮案震驚了整個濱河市豆茫,隨后出現(xiàn)的幾起案子侨歉,更是在濱河造成了極大的恐慌屋摇,老刑警劉巖揩魂,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炮温,居然都是意外死亡火脉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門柒啤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倦挂,“玉大人,你說我怎么就攤上這事担巩》皆” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵涛癌,是天一觀的道長犯戏。 經(jīng)常有香客問我,道長拳话,這世上最難降的妖魔是什么先匪? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮弃衍,結(jié)果婚禮上呀非,老公的妹妹穿的比我還像新娘。我一直安慰自己镜盯,他們只是感情好岸裙,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著速缆,像睡著了一般哥桥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上激涤,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天拟糕,我揣著相機與錄音,去河邊找鬼倦踢。 笑死送滞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辱挥。 我是一名探鬼主播犁嗅,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晤碘!你這毒婦竟也來了褂微?” 一聲冷哼從身側(cè)響起功蜓,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宠蚂,沒想到半個月后式撼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡求厕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年著隆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呀癣。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡美浦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出项栏,到底是詐尸還是另有隱情浦辨,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布沼沈,位于F島的核電站流酬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏庆冕。R本人自食惡果不足惜康吵,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望访递。 院中可真熱鬧晦嵌,春花似錦、人聲如沸拷姿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽响巢。三九已至描滔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踪古,已是汗流浹背含长。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伏穆,地道東北人拘泞。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像枕扫,于是被迫代替她去往敵國和親陪腌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348