SpringBoot使用@EnableAutoConfiguration實現自動配置詳解
@EnableAutoConfiguration註解
其實SpringBoot自動配置的原理主要是用的這個@EnableAutoConfiguration註解,其原理為以下三點:
(1)在@EnableAutoConfiguration註解內部使用@Import(AutoConfigurationImportSelector.class)來加載配置類;
(2)配置文件位置:META-INF/spring.factories,該配置文件中定義瞭大量的配置類,當SpringBoot項目啟動時,會自動加載這些配置類,初始化Bean;
(3)並不是所有的Bean都會被初始化,在配置類文件中使用Condition來加載滿足條件的Bean。
一個簡單的案例
上面的原理看上去還是不太好理解的,這個需要查看源碼結合理解,接下來我就就一個簡單的例子來解釋一下。
一個簡單的需求:讓SpringBoot自動幫我們創建一個User和Role的Bean對象。
第一步,自定義配置類
package cs.yangtze.springboot_enable_other.config; import cs.yangtze.springboot_enable_other.entity.Role; import cs.yangtze.springboot_enable_other.entity.User; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class UserConfig { @Bean @ConditionalOnProperty(name = "lxr",havingValue = "20") public User user(){ return new User(); } @Bean public Role role(){ return new Role(); } }
第二步,ImportSelector實現類來加載自定義的配置類,這就對應原理的(1)
package cs.yangtze.springboot_enable_other.config; import org.springframework.context.annotation.ImportSelector; import org.springframework.core.type.AnnotationMetadata; public class MyImportSelect implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { {"cs.yangtze.springboot_enable_other.config.UserConfig"}; } }
原理(2)中配置文件位置是這樣的,但我們自己自定義的配置文件位置不一樣,當SpringBoot項目啟動時,會自動加載配置類,初始化Bean
@Import(MyImportSelect.class) @SpringBootApplication public class SpringbootEnableApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args); Role role =context.getBean(Role.class); System.out.println(role); User user = context.getBean(User.class); System.out.println(user); } }
這時候我們來看一下控制臺打印結果:
我們會發現,Role的Bean對象正常打印瞭,但是User的並沒有,這是為什麼?
這時候就對應原理(3),並不是所有的Bean都會被初始化,因為我在自定義的UserConfig配置類中,在User上加上瞭@ConditionalOnProperty(name = “lxr”,havingValue = “20”)條件註解,隻有當我的配置文件application.properties中有這個鍵值對時才能夠創建User對象。
最終也是得到正確結果
總結
SpringBoot自動配置的原理就是以上三點,我舉的例子應該能夠很好地幫助你理解,如果有什麼不對的地方還請大傢批評指正,這也是我看瞭幾遍視頻後的理解。
到此這篇關於SpringBoot使用@EnableAutoConfiguration實現自動配置詳解的文章就介紹到這瞭,更多相關SpringBoot @EnableAutoConfiguration內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Spring自動配置之condition條件判斷下篇
- Spring自動配置之condition條件判斷上篇
- SpringBoot開發實戰之自動配置
- SpringBoot原理之自動配置機制詳解
- SpringBoot自動配置與啟動流程詳細分析