Spring創(chuàng)建Bean的流程分享
Spring創(chuàng)建Bean流程


大致步驟
簡(jiǎn)單來(lái)說(shuō):Bean會(huì)經(jīng)歷四個(gè)階段: 實(shí)例化–》屬性賦值–》初始化–》銷(xiāo)毀
具體來(lái)說(shuō):
- 實(shí)例化:new xxx();有兩個(gè)時(shí)候會(huì)觸發(fā)實(shí)例化:
像容器申請(qǐng)一個(gè)Bean的時(shí)候
當(dāng)容器在初始化一個(gè)Bean的時(shí)候,發(fā)現(xiàn)該Bean還依賴(lài)另一個(gè)Bean。(在BeanDefinition中找到)
- 設(shè)置對(duì)象屬性:通過(guò)BD找到Bean需要注入的一些屬性,并注入,當(dāng)發(fā)現(xiàn)依賴(lài)另一個(gè)對(duì)象時(shí),觸發(fā)另一個(gè)對(duì)象的實(shí)例化。
- 處理Aware接口:Spring會(huì)檢測(cè)對(duì)象是否實(shí)現(xiàn)了XxxAware接口,如果實(shí)現(xiàn)了,就會(huì)調(diào)用對(duì)應(yīng)的方法。例如BeanNameAware(對(duì)BeanName進(jìn)行設(shè)置)、BeanClassLoaderAware(傳入一個(gè)自定義類(lèi)加載器)、BeanFactoryAware(擴(kuò)展BeanFactory)BeanPostProcessor的前置處理。
initializingBean: Spring檢測(cè)對(duì)象如果實(shí)現(xiàn)了這個(gè)接口,就會(huì)執(zhí)行他的afterPropertiesSet()方法,定制初始化邏輯。init-method:如果Spring發(fā)現(xiàn)Bean實(shí)現(xiàn)了這個(gè)屬性,就會(huì)調(diào)用他的配置方法,執(zhí)行初始化邏輯?;蛘呤褂米⒔?BeanPostProcessor的后置處理。到目前位置,Bean的創(chuàng)建過(guò)程就完成了,可以正常使用了。DisposableBean:當(dāng)Bean實(shí)現(xiàn)了這個(gè)接口,在銷(xiāo)毀前就會(huì)調(diào)用destory()方法destory-method:銷(xiāo)毀方法,可以進(jìn)行內(nèi)存回收,通過(guò)@PreDestory注解
各個(gè)接口介紹
1.什么是BeanDefinition?
? BeanDefinition 是定義 Bean 的配置元信息接口
- Bean 的類(lèi)名
- 設(shè)置父 bean 名稱(chēng)
- Bean 行為配置信息,作用域、自動(dòng)綁定模式、生命周期回調(diào)、延遲加載、初始方法、銷(xiāo)毀方法等
- Bean 之間的依賴(lài)設(shè)置,dependencies
- 構(gòu)造參數(shù)、屬性設(shè)置

2.Aware接口
該接口是一個(gè)標(biāo)識(shí)接口,具體的方法需要子類(lèi)自己去實(shí)現(xiàn)。
Aware類(lèi)型的接口的作用就是讓我們能夠拿到Spring容器中的一些資源。
基本都能夠見(jiàn)名知意,Aware之前的名字就是可以拿到什么資源,例如BeanNameAware可以拿到BeanName,以此類(lèi)推。
調(diào)用時(shí)機(jī)需要注意:所有的Aware方法都是在初始化階段之前調(diào)用的!
3.BeanPostProcessor
做通知。
4.initializingBean
afterPropertiesSet這個(gè)方法可以用在一些特殊情況中,也就是某個(gè)對(duì)象的某個(gè)屬性需要經(jīng)過(guò)外界得到。
比如說(shuō)查詢(xún)數(shù)據(jù)庫(kù)等方式,這時(shí)候可以用到spring的該特性,只需要實(shí)現(xiàn)InitializingBean即可
5.init-method
用來(lái)替代繼承 InitializingBean接口
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
每日六道java新手入門(mén)面試題,通往自由的道路第二天
這篇文章主要為大家分享了最有價(jià)值的6道java面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,對(duì)hashCode方法的設(shè)計(jì)、垃圾收集的堆和代進(jìn)行剖析,感興趣的小伙伴們可以參考一下2021-06-06
java多線程加鎖以及Condition類(lèi)的使用實(shí)例解析
這篇文章主要介紹了java多線程加鎖以及Condition類(lèi)的使用實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
SpringBoot使用Editor.md構(gòu)建Markdown富文本編輯器示例
這篇文章主要介紹了SpringBoot使用Editor.md構(gòu)建Markdown富文本編輯器示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
深入講解spring boot中servlet的啟動(dòng)過(guò)程與原理
這篇文章主要給大家介紹了關(guān)于spring boot中servlet啟動(dòng)過(guò)程與原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
Spring中如何使用@Value注解實(shí)現(xiàn)給Bean屬性賦值
這篇文章主要介紹了Spring中如何使用@Value注解實(shí)現(xiàn)給Bean屬性賦值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
IntellJ IDEA JAVA代碼任務(wù)標(biāo)記實(shí)例解析
這篇文章主要介紹了IntellJ IDEA JAVA代碼任務(wù)標(biāo)記實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Spring Boot之AOP配自定義注解的最佳實(shí)踐過(guò)程
這篇文章主要給大家介紹了關(guān)于Spring Boot之AOP配自定義注解的最佳實(shí)踐過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
在Spring Boot中集成RabbitMQ的實(shí)戰(zhàn)記錄
本文介紹SpringBoot集成RabbitMQ的步驟,涵蓋配置連接、消息發(fā)送與接收,并對(duì)比兩種定義Exchange與隊(duì)列的方式:手動(dòng)聲明(適合復(fù)雜路由)和注解綁定(適合快速開(kāi)發(fā)),感興趣的朋友跟隨小編一起看看吧2025-06-06
淺析Java中Apache BeanUtils和Spring BeanUtils的用法
這篇文章主要介紹了Java中Apache BeanUtils和Spring BeanUtils的用法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

