目的:從底層源碼角度分析 Spring Boot 配置類以及自動裝載的底層原理
文章目錄
- 1. Spring Boot 配置類實現自動裝載
- 1.1 @Configuration注解
- 1.2 @Configuration 注解完成 bean 注入流程圖
- 1.3 @ConfigurationProperties注解賦值
- 2. Spring Boot的核心機制:自動裝配
- 2.1 @SpringBootConfiguration注解
- 2.2 @EnableAutoConfiguration注解
- 2.3 @ComponentScan 注解
- 2.4 總結
1. Spring Boot 配置類實現自動裝載
在講 spring 時,spring.xml 中配置的 bean:在進行依賴注入時,通過 ref 屬性來進行,也就是手動裝載;然后就是自動裝載(2種);然后又講到沒有配置文件是怎么裝載(通過 @Autowired注解);
這里再來說一個沒有配置文件怎么裝載(也就是 spring boot 中是如何進行依賴注入的)。
1.1 @Configuration注解
Spring Boot 已經去掉了 XML 文件,那么在 Spring Boot 中是如何進行 bean 依賴注入呢?----> 在 Spring Boot 中,通過配置類的方式來完成 bean 的依賴注入。配置類顧名思義就是專門寫一個 Java 類用來做配置,以取代 XML 配置文件的方式,這里的配置類不需要繼承任何類,也不需要實現任何接口,只需要在類定義處添加 @Configuration
注解即可。接下來我們通過配置類的形式完成Account 對象的注入。
1、創建配置類 BeanConfiguration
,在類定義處添加 @Configuration
注解,同時定義一個返回值為 Account 的方法,并在方法定義處添加 @Bean 注解,代碼如下所示。
配置類可以把它比作 XML 文件:類就等同于 XML 文件本身,類中添加了 @Bean 注解的方法就等同于 XML 文件中的 bean 標簽,方法返回的對象就是要注入到容器中的 bean。
2、測試:
發現: 成功從容器中取出了 account 對象,這里是通過 beanName 取值的,所以可以得出結論,當前的 Account 對象 beanName 為 account,我們并沒有手動設置 beanName,所以這個 beanName 取的是默認值,那么這里的默認值是如何設置的呢? 并非是取返回值類名首字母小寫,而是方法名
1.2 @Configuration 注解完成 bean 注入流程圖
1、啟動 ApplicationContext
的時候傳入配置類。
2、判斷配置類是否添加了 @Configuration 注解,如果沒有添加則不做處理,如果添加了則解析該配置類。
3、遍歷配置類的所有方法,判斷這些方法是否添加了 @Bean 注解,如果沒有添加則不做處理,如果添加了則說明該方法的返回值就是需要注入的 bean。
4、通過反射機制執行該方法,獲得返回值,同時獲取方法名。
5、將方法名和返回值以 key-value
的形式存入容器中,供開發者調用。
流程圖如下:
1.3 @ConfigurationProperties注解賦值
該注解的作用是在 Spring Boot 項目中直接讀取 application.yml 配置文件中的數據并賦值給 bean 中的成員變量。
1、創建一個實體類,添加 @ConfigurationProperties 注解, 并通過 p