您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Spring源碼怎樣分析ioc容器,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
無論是基于xml配置文件方式還是基于@Configuration注解配置類方式,spring都是將我們配置的bean解析為BeanDefinition對象的,一個BeanDefinition就是對一個bean的定義,BeanDefinition存儲了一個bean的類名、實例化這個bean將使用的構造參數及參數值、實例化這個bean時需要注入的字段名和字段的值等。
BeanDefinition的是對一個對象的描述,比如說你現在想讓技術員幫你組裝一臺電腦,技術員就會向你詢問你想要怎樣的一臺電腦,對cpu的要求、對顯卡的要求是什么,以及對內存的要求等,然后技術員就會根據你的要求去給你組裝電腦,你可能是跟朋友一起組裝,要求同一樣的配置。這時候,你對組裝電腦的要求就是對電腦的定義,spring中對bean的定義就是BeanDefinition,如果你只是想要一臺,那么技術員就只會給你組裝一臺,這就是單例,spring中bean工廠就相當于技術員的角色,而如果你是想要一樣的配置組裝多臺電腦這就可以理解為原型。
如果是使用xml配置文件方式,那么spring首先會讀取xml配置文件,將xml文件解析為一個個節點,然后獲取配置文件中的<bean>節點,根據這些bean節點創建BeanDefinition對象。默認會使用無參數構造函數實例化目標bean,但如果這個bean在配置文件中指定了構造參數,那么這些構造參數的配置也會存儲在BeanDefinition對象中,在實例化的時候spring就會尋找匹配的構造函數使用配置文件中配置的參數值來實例化這個bean。在xml文件中配置bean的時候構造參數和屬性注入都可以是ref引用別的bean,這就是依賴,spring會保證在實例化這個bean之前先實例化依賴的bean。
使用注解配置類方式會有些不同,如果實例化AnnotationConfigApplicationContext應用上下文的時候使用的是指定注解配置類的構造方法,那么會先注冊這個注解配置類到bean工廠,也就是將這個配置類解析為一個BeanDefinition對象注冊到bean工廠,然后在refresh階段先初始化bean工廠(做一些配置)之后再調用bean工廠后置處理器。上一篇介紹重點介紹了ConfigurationClassPostProcessor這個spring自己注入的bean,這也是一個bean工廠后置處理器。在bean工廠后置處理器ConfigurationClassPostProcessor中解析配置類的BeanDefinition對象,就是處理配置類上的注解和其方法體內的@Bean方法。
如果配置類(此時配置類已經是一個BeanDefinition對象)上有掃描包的注解就去掃描指定包,掃描指定包下被@Component等注解的類將其解析為BeanDefinition對象,最后將掃描的BeanDefinition結果集注冊到bean工廠。如果掃描結果中有@Configuration注解配置類,后續還會繼續解析掃描到的注解配置類(被@Configuration注解的BeanDefinition對象)。如果當前配置類有@Import注解,會先處理@Import導入的bean或者注解配置類。@Bean就相對復雜一點,這里就先不提。這是一個廣度優先遍歷,直到所有的bean都被注冊以及所有的注解配置類都被解析處理。
如果bean配置了懶初始化,那么只有在我們調用工廠的getBean方法的時候才會去實例化這個bean,當然如果這個bean是單例的且其它bean會依賴這個bean,那么在其它bean實例化的時候也會將這個bean先實例化。
bean的實例化是根據beanName獲取到其BeanDefinition對象,根據BeanDefinition對象中保存的bean的ClassName并使用bean工廠的類加載器來這個ClassName的Class對象,最后才調用這個Class對象的newInstance方法實例化bean。實例化bean完成之后還會使用BeanUtil工具類為其屬性賦值,就是我們配置的這個bean需要注入的屬性。
在bean實例化完成且注入屬性值之后會調用配置的初始化方法(如果有initMethod或者這個bean實現了InitializingBean接口)。在調用初始化方法之前會先調用bean后置處理器BeanPostProcessor的postProcessBeforeInitialization方法,且在調用初始化方法完成之后會調用BeanPostProcessor的postProcessAfterInitialization方法。這些BeanPostProcessor可以不止一個,你可以注入多個,多個BeanPostProcessor都會被調用,且bean工廠中每個bean在調用初始化方法前后都會調用這些BeanPostProcessor。
前面幾篇所講的內容基本上也就那么多了,還有很多內容是沒講到的,因為spring的復雜并不是這么簡短的文字就能說完的,不復雜又怎么會這么強大呢?還有spring的aop功能的實現,如果有時間我還會繼續分析,但也可能會暫停下來而去學習新的技能:spring cloud。
看完上述內容,你們對Spring源碼怎樣分析ioc容器有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。