SpringBoot使用@EnableAutoConfiguration實現(xiàn)自動配置詳解
@EnableAutoConfiguration注解
其實SpringBoot自動配置的原理主要是用的這個@EnableAutoConfiguration注解,其原理為以下三點:
(1)在@EnableAutoConfiguration注解內(nèi)部使用@Import(AutoConfigurationImportSelector.class)來加載配置類;
(2)配置文件位置:META-INF/spring.factories,該配置文件中定義了大量的配置類,當SpringBoot項目啟動時,會自動加載這些配置類,初始化Bean;
(3)并不是所有的Bean都會被初始化,在配置類文件中使用Condition來加載滿足條件的Bean。
一個簡單的案例
上面的原理看上去還是不太好理解的,這個需要查看源碼結合理解,接下來我就就一個簡單的例子來解釋一下。
一個簡單的需求:讓SpringBoot自動幫我們創(chuàng)建一個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實現(xiàn)類來加載自定義的配置類,這就對應原理的(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);
}
}這時候我們來看一下控制臺打印結果:

我們會發(fā)現(xiàn),Role的Bean對象正常打印了,但是User的并沒有,這是為什么?
這時候就對應原理(3),并不是所有的Bean都會被初始化,因為我在自定義的UserConfig配置類中,在User上加上了@ConditionalOnProperty(name = “lxr”,havingValue = “20”)條件注解,只有當我的配置文件application.properties中有這個鍵值對時才能夠創(chuàng)建User對象。

最終也是得到正確結果
總結
SpringBoot自動配置的原理就是以上三點,我舉的例子應該能夠很好地幫助你理解,如果有什么不對的地方還請大家批評指正,這也是我看了幾遍視頻后的理解。
到此這篇關于SpringBoot使用@EnableAutoConfiguration實現(xiàn)自動配置詳解的文章就介紹到這了,更多相關SpringBoot @EnableAutoConfiguration內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringBoot自動配置@EnableAutoConfiguration過程示例
- SpringBoot中的@EnableAutoConfiguration注解解析
- Springboot注解之@EnableAutoConfiguration詳解
- SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別
- SpringBoot中@EnableAutoConfiguration注解源碼分析
- 解析SpringBoot @EnableAutoConfiguration的使用
- SpringBoot中@EnableAutoConfiguration注解的實現(xiàn)
相關文章
詳解Eclipse Validating緩慢的優(yōu)化
這篇文章主要介紹了詳解Eclipse Validating緩慢的優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03
SpringMvc自動裝箱及GET請求參數(shù)原理解析
這篇文章主要介紹了SpringMvc自動裝箱及GET請求參數(shù)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09
spring事務Propagation及其實現(xiàn)原理詳解
這篇文章主要介紹了spring事務Propagation及其實現(xiàn)原理詳解,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02
druid?handleException執(zhí)行流程源碼解析
這篇文章主要為大家介紹了druid?handleException執(zhí)行流程源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09

