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

我們會(huì)發(fā)現(xiàn),Role的Bean對(duì)象正常打印了,但是User的并沒(méi)有,這是為什么?
這時(shí)候就對(duì)應(yīng)原理(3),并不是所有的Bean都會(huì)被初始化,因?yàn)槲以谧远x的UserConfig配置類(lèi)中,在User上加上了@ConditionalOnProperty(name = “lxr”,havingValue = “20”)條件注解,只有當(dāng)我的配置文件application.properties中有這個(gè)鍵值對(duì)時(shí)才能夠創(chuàng)建User對(duì)象。

最終也是得到正確結(jié)果
總結(jié)
SpringBoot自動(dòng)配置的原理就是以上三點(diǎn),我舉的例子應(yīng)該能夠很好地幫助你理解,如果有什么不對(duì)的地方還請(qǐng)大家批評(píng)指正,這也是我看了幾遍視頻后的理解。
到此這篇關(guān)于SpringBoot使用@EnableAutoConfiguration實(shí)現(xiàn)自動(dòng)配置詳解的文章就介紹到這了,更多相關(guān)SpringBoot @EnableAutoConfiguration內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot自動(dòng)配置@EnableAutoConfiguration過(guò)程示例
- SpringBoot中的@EnableAutoConfiguration注解解析
- Springboot注解之@EnableAutoConfiguration詳解
- SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別
- SpringBoot中@EnableAutoConfiguration注解源碼分析
- 解析SpringBoot @EnableAutoConfiguration的使用
- SpringBoot中@EnableAutoConfiguration注解的實(shí)現(xiàn)
相關(guān)文章
Java基于Guava Retrying實(shí)現(xiàn)重試功能
這篇文章主要介紹了Java基于Guava Retrying實(shí)現(xiàn)重試功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Spring+SpringMVC+MyBatis深入學(xué)習(xí)及搭建(三)之MyBatis全局配置文件解析
這篇文章主要介紹了Spring+SpringMVC+MyBatis深入學(xué)習(xí)及搭建(三)之MyBatis全局配置文件解析,需要的朋友可以參考下2017-05-05
徹底理解Spring注解@Autowired實(shí)現(xiàn)原理
這篇文章主要為大家詳細(xì)的介紹了Spring注解@Autowired實(shí)現(xiàn)的原理,縝密的邏輯分析,實(shí)踐應(yīng)用示例操作說(shuō)明,讓大家徹底的理解Spring注解@Autowired背后實(shí)現(xiàn)原理2022-03-03
SpringBoot中多環(huán)境配置和@Profile注解示例詳解
這篇文章主要介紹了SpringBoot中多環(huán)境配置和@Profile注解,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01
Caused by: java.lang.ClassNotFoundException: org.objectweb.a
這篇文章主要介紹了Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type異常,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
解決使用IDEA時(shí)跳轉(zhuǎn)到.class的問(wèn)題
這篇文章主要介紹了解決使用IDEA時(shí)跳轉(zhuǎn)到.class的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java實(shí)現(xiàn)簡(jiǎn)單QQ登錄界面
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單QQ登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05

