<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Spring 提供了豐富的特性和功能,包括依賴注入、面向切面程式設計、事務管理、資料存取、Web應用程式開發等。其中,@Configuration 是 Spring 中的一個註解,它用於標記一個類為設定類,通過設定類可以定義和組裝 Spring Bean,並且支援高度靈活的設定方式。在本文中,我們將深入探討 @Configuration 註解的底層原理,包括其與 Spring IoC 容器的整合、其對 Bean 的定義和裝配的實現,以及其在 Spring 框架中的作用和用法。
@Configuration 註解是 Spring 3.0 版本引入的新特性,它用於將一個類標記為設定類,通過設定類可以定義和組裝 Spring Bean。
設定類是一個普通的 Java 類,但是在類級別上新增了 @Configuration 註解,表明這個類用於設定 Spring Bean 的建立和管理。設定類可以包含多個用於定義 Bean 的方法,這些方法使用 @Bean 註解來標記,並且返回一個物件,該物件會被 Spring IoC 容器管理。
設定類可以通過多種方式建立和組裝 Bean,包括使用其他設定類的 Bean、通過依賴注入注入其他 Bean、通過條件註解實現 Bean 的條件化建立等。設定類可以在 XML 組態檔、JavaConfig 類、註解等方式中進行定義,使得 Spring 的設定更加靈活和方便。
@Configuration 註解的主要作用有以下幾點:
定義 Bean:通過在設定類中使用 @Bean 註解,可以定義和組裝 Bean,並將其納入 Spring IoC 容器的管理,從而使得這些 Bean 可以在應用程式中被使用。
管理依賴關係:設定類可以通過依賴注入的方式引入其他 Bean,從而實現 Bean 之間的依賴關係管理。這樣,當建立一個 Bean 時,其依賴的其他 Bean 會被自動注入,從而方便地管理 Bean 之間的依賴關係。
提供條件化設定:設定類可以通過條件註解實現 Bean 的條件化建立,從而根據不同的條件建立不同的 Bean。這可以用於根據環境、設定等動態地選擇 Bean 的建立方式,使得設定更加靈活。
@Configuration 註解的底層原理主要包括以下幾個方面的內容:與 Spring IoC 容器的整合、Bean 的定義和裝配的實現、條件化設定的實現、以及設定類的載入和範例化過程。
@Configuration 註解與 Spring IoC 容器的整合是通過 ConfigurationClassPostProcessor 類來實現的。ConfigurationClassPostProcessor 是一個 Bean 後置處理器,它負責處理標記了 @Configuration 註解的設定類,並將其轉換為 Bean 定義並註冊到 Spring IoC 容器中。
ConfigurationClassPostProcessor 的處理過程分為三個階段:
解析階段:ConfigurationClassPostProcessor 會掃描設定類的類級別上的 @Configuration 註解,並解析其中的 Bean 定義和依賴關係,生成相應的 BeanDefinition 物件。
註冊階段:ConfigurationClassPostProcessor 將解析得到的 BeanDefinition 物件註冊到 Spring IoC 容器中,成為真正的 Spring Bean。
驗證階段:ConfigurationClassPostProcessor 會驗證設定類中的 Bean 定義和依賴關係是否正確,如果有錯誤則會丟擲異常。
通過 ConfigurationClassPostProcessor 的處理,@Configuration 註解標記的設定類會被解析成真正的 BeanDefinition 物件,並註冊到 Spring IoC 容器中,從而使得這些設定類中定義的 Bean 可以被 Spring 容器管理和使用。
@Configuration 註解標記的設定類中,可以使用 @Bean 註解來定義 Bean,並將其納入 Spring IoC 容器的管理。@Bean 註解的底層實現主要通過BeanMethod類來實現。
BeanMethod類是一個內部類,它表示一個設定類中使用 @Bean 註解定義的方法。每個使用 @Bean 註解的方法都會被 BeanMethod 類表示,幷包含相應的 Bean 定義資訊,例如 Bean 的名稱、型別、作用域、初始化方法、銷燬方法等。
在解析階段,ConfigurationClassPostProcessor 會掃描設定類中的 @Bean 註解,解析其中的 Bean 定義資訊,並將其封裝成 BeanMethod 物件。在註冊階段,ConfigurationClassPostProcessor 會根據 BeanMethod 物件建立相應的 BeanDefinition 物件,並註冊到 Spring IoC 容器中。
在裝配階段,當需要獲取一個使用 @Bean 註解定義的 Bean 時,Spring IoC 容器會通過呼叫相應的 BeanMethod 物件的方法來建立 Bean 的範例。這樣,@Bean 註解的設定類中定義的 Bean 就可以被自動建立和裝配到其他 Bean 中,實現了依賴注入的功能。
@Configuration 註解支援條件化設定,即根據不同的條件來判斷是否載入某個設定類或者建立某個 Bean。這個功能的底層實現主要依賴於 Condition 介面和 ConditionContext、AnnotatedTypeMetadata兩個介面的實現。
Condition 介面定義了一個 matches 方法,用於判斷是否滿足條件。當某個設定類或者 Bean 使用了 @Conditional 註解,並傳入了一個實現了 Condition 介面的類時,Spring IoC 容器會在解析階段呼叫這個 Condition 類的 matches 方法來判斷是否滿足條件。如果滿足條件,那麼這個設定類或者 Bean 就會被載入或者建立,否則就會被忽略。
ConditionContext 和 AnnotatedTypeMetadata 介面分別用於在 Condition 介面的 matches 方法中獲取當前的上下文資訊和註解後設資料。ConditionContext 提供了獲取 BeanFactory、Environment、ResourceLoader、ClassLoader 等資訊的方法,可以用於判斷當前環境的狀態。AnnotatedTypeMetadata 則提供了獲取設定類或者 Bean 的註解資訊的方法,可以用於判斷註解的屬性值是否滿足條件。
通過這些介面的實現,@Conditional 註解的設定類或者 Bean 可以根據不同的條件來進行動態載入或者建立,從而實現了條件化設定的功能。
@Configuration 註解標記的設定類在 Spring IoC 容器中的載入和範例化過程主要包括以下幾個步驟:
載入設定類:當 Spring IoC 容器啟動時,會掃描所有的設定類,並將其載入到容器中。這個過程是通過 ConfigurationClassParser 類來實現的。
ConfigurationClassParser 類負責解析設定類中的註解,包括 @Configuration、@Bean、@ComponentScan 等註解,並生成相應的 BeanDefinition 物件。其中,@ComponentScan 註解用於指定需要掃描的包,從而找到其他的設定類和 Bean 定義。
解析 Bean 定義和依賴關係:在載入設定類的過程中,ConfigurationClassParser 會解析設定類中的 @Bean 註解,並生成相應的 BeanDefinition 物件。同時,它還會解析設定類中的其他註解,例如 @Autowired、@Value 等註解,從而生成 Bean 之間的依賴關係。
註冊 Bean 定義:在解析完 Bean 定義和依賴關係後,ConfigurationClassParser 會將生成的 BeanDefinition 物件註冊到 Spring IoC 容器中。這個過程是通過呼叫 BeanDefinitionRegistry 介面的 registerBeanDefinition 方法來實現的。
範例化 Bean:當需要獲取某個 Bean 時,Spring IoC 容器會根據 Bean 的定義資訊,範例化 Bean 並將其放入容器中。這個過程是通過呼叫 BeanFactory 介面的 getBean 方法來實現的。
在範例化 Bean 的過程中,Spring IoC 容器會先判斷 Bean 是否已經存在於容器中。如果存在,則直接返回已經存在的 Bean 範例;如果不存在,則會通過 Bean 的定義資訊來建立新的 Bean 範例。
在建立Bean範例時,Spring IoC 容器會先檢查 Bean 的建構函式是否有引數。如果有引數,則會按照引數型別或者引數名來從容器中獲取對應的 Bean 範例,並傳入建構函式中。如果沒有引數,則直接呼叫無參建構函式來建立 Bean 範例。
建立Bean範例後,Spring IoC 容器會對 Bean 進行初始化,包括呼叫 Bean 的初始化方法(例如 @PostConstruct 註解標記的方法)、應用 Bean 的屬性值(例如 @Value 註解標記的屬性)、處理 Bean 的生命週期回撥(例如 InitializingBean 和 DisposableBean 介面的實現)等。
最後,建立完成的 Bean 範例會被放入容器中,並可以通過 Bean 的名稱或者型別來進行存取和使用。
@Configuration 註解是 Spring 框架中用於標記設定類的重要註解之一。它允許我們通過 Java 類的方式來設定和管理 Bean 範例,從而實現了物件導向的設定方式。
@Configuration 註解的底層原理涉及到了代理物件、迴圈依賴解決方案、重新整理機制、條件化設定等多個方面。通過深入理解 @Configuration 註解的原理,我們可以更好地理解 Spring 框架中的設定方式,並在實際專案中靈活地應用。
在使用 @Configuration 註解時,需要注意一些常見的使用原則,例如避免在設定類中使用 @Autowired 註解、避免迴圈依賴、合理使用條件化設定等。同時,深入瞭解 @Configuration 註解的原始碼實現,對於排查和解決設定相關的問題也是非常有幫助的。
以上就是詳解Spring註解 @Configuration的詳細內容,更多關於pring註解 @Configuration的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45