網(wǎng)站首頁 編程語言 正文
一、@SpringBootConfiguration注解的作用
????????????????@SpringBootApplication注解是SpringBoot項(xiàng)目的核心注解,加在啟動引導(dǎo)類上。點(diǎn)擊進(jìn)去可以發(fā)現(xiàn)@SpringBootApplication注解是一個(gè)組合注解。其中@SpringBootConfiguration和@EnableAutoConfiguration是由Spring提供的,剩下的注解是由JDK提供的。對于SpringBoot項(xiàng)目,我們重點(diǎn)分析@SpringBootConfiguration和@EnableAutoConfiguration注解。
1.1、@SpringBootConfiguration表示啟動引導(dǎo)類是一個(gè)配置類
? ? ? ??點(diǎn)擊@SpringBootConfiguration注解進(jìn)去可以發(fā)現(xiàn)@SpringBootConfiguration注解也是一個(gè)組合注解,并且繼承了@Configuration注解,說明@SpringBootApplication注解間接繼承了
@Configuration注解。
????????@Configuration注解又加在了啟動引導(dǎo)類上面,說明啟動引導(dǎo)類是一個(gè)配置類,配置類中加了@Bean注解的方法的返回值會放入Spring的容器中。
代碼演示:
啟動引導(dǎo)類中添加@Bean注解的方法
package com.itboy;
import com.itboy.Import.MyImportSeletor;
import com.itboy.pojo.User;
import org.example.config.BrandAutoConfiguration;
import org.example.config.UserAutoConfiguration;
import org.example.pojo.Brand;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
/**
*
*/
@SpringBootApplication
public class SpringBootPlusApplication {
public static void main(String[] args) {
ConfigurableApplicationContext app = SpringApplication.run(SpringBootPlusApplication.class, args);
User user = app.getBean(User.class);
System.out.println("user = " + user);
}
@Bean
public User testUser(){
return new User();
}
}
????????運(yùn)動程序,發(fā)現(xiàn)可以從容器中獲得User對象,說明添加了@Bean注解的方法的返回值放到了Spring容器中。
所以@SpringBootConfiguration注解的第一個(gè)作用就是將啟動引導(dǎo)類變成配置類。
1.2、?@SpringBootConfiguration可以讓測試類能夠找到啟動引導(dǎo)類
? ? ? ? 注釋掉啟動引導(dǎo)類上面的@SpringBootApplication注解,然后啟動@SpringBootTest測試類中的測試方法,會發(fā)現(xiàn)報(bào)錯(cuò)。
Unable to find a @SpringBootConfiguration?
說明?@SpringBootTest測試類中的測試方法會去找@SpringBootConfiguration注解。
此時(shí)需要手動指定啟動引導(dǎo)類才能解決報(bào)錯(cuò)問題。
?
1.3、總結(jié)?
?@SpringBootConfiguration注解的作用有:
1、表示啟動引導(dǎo)類是一個(gè)配置類,因?yàn)橄喈?dāng)于@SpringBootApplication注解間接繼承了@Configuration注解。
2、?讓測試類能夠找到啟動引導(dǎo)類,具體的看1.2中的內(nèi)容。
二、@Import注解的作用?
?通過@Import注解中的導(dǎo)入器我們可以指定配置類。
我們在pom.xml配置文件中添加創(chuàng)建的模塊
創(chuàng)建的模塊結(jié)構(gòu)如下圖:
?
創(chuàng)建的模塊中存在兩個(gè)配置類UserAutoConfiguration和BrandAutoConfiguration?
??????????????????????????????????
?
?
創(chuàng)建的模塊和我們主模塊之間的位置關(guān)系:
?
????????所以創(chuàng)建的模塊肯定不在spring_boot項(xiàng)目啟動引導(dǎo)類的包及其子包中。?所以在spring_boot項(xiàng)目的容器對象中肯定不能獲取到創(chuàng)建的模塊中的User和brand對象。
? ? ? ? 但是在啟動引導(dǎo)類上添加@Import注解就能獲取到User和brand對象。
????????通過@Import注解中的導(dǎo)入器能指定配置類有哪些,@Import注解中的值相當(dāng)于導(dǎo)入器,這里的MyImportSeletor.class是我自定義的導(dǎo)入器。
?
????????導(dǎo)入器需要實(shí)現(xiàn)ImportSelector接口,并重寫selectImports方法,返回值為字符串?dāng)?shù)組,里面的值為配置類的全限定名,通過返回值就能確定配置類有哪些。
? ? ? ? 再找到配置類中加了@Bean注解的方法,方法的返回值就會放入spring的容器中。就完成了自動裝配的工程。
總結(jié)
1、@Import注解可以通過導(dǎo)入器指定配置類。
2、@Import注解中的值是導(dǎo)入器,通過導(dǎo)入器我們可以指定配置類。
3、配置類中加了@Bean注解的方法的返回值就會放到spring容器中,從而實(shí)現(xiàn)自動裝配。
三、@EnableAutoConfiguration注解的作用?
????????@EnableAutoConfiguration注解是組合注解,繼承了@Import注解。
????????
? ? ? ? 通過二中分析我們知道可以通過@Import注解中的導(dǎo)入器找到配置類,這里的AutoConfigurationImportSelector.class就是SpringBoot定義的導(dǎo)入器,所以繼續(xù)點(diǎn)擊導(dǎo)入器。
? ? ? ? 發(fā)現(xiàn)AutoConfigurationImportSelector.class導(dǎo)入器中存在selectImports方法,并且方法返回值為字符串?dāng)?shù)組,與二中剛才的分析保持一致,所以這個(gè)selectImports方法就是指定配置類。
????????if的條件判斷是返回沒有導(dǎo)入的情況,所以else里面的邏輯才是指定配置類。?
? ? ? ? 接著點(diǎn)擊selectImports方法中的getAutoConfigurationEntry方法,再點(diǎn)擊getAutoConfigurationEntry方法中的getCandidateConfigurations方法????????
????????
? ? ? ? 接著點(diǎn)擊?getCandidateConfigurations方法中的loadFactoryNames方法
? ??
?
? ? ? ? ?接著點(diǎn)擊loadFactoryNames方法中的loadSpringFactories方法
? ? ? ? 最后發(fā)現(xiàn)讀取的是META-INF文件夾里面的spring.factorie文件?
?
總結(jié):
1、?@EnableAutoConfiguration注解的作用是完成SpringBoot項(xiàng)目的自動裝配。
2、會去讀取META-INF文件夾里面的spring.factorie文件。
3、spring.factorie文件中定義了指定的配置類,找到配置類,并把配置類中加了@Bean注解的方法的返回值放入Spring容器就完成了自動裝配。
四、自動裝配的條件選擇
4.1、SpringBoot自帶的Starter和第三方Starter
????????SpringBoot提供的Starter是以spring-boot-starter開頭的,例如spring-boot-starter-web和spring-boot-starter-test
????????????????
????????第三方提供的starter一般是以spring-boot-starter為結(jié)尾的。例如:mybatis-spring-boot-starter
? ? ? ?
?
4.2、通過在External Libraries中找到對應(yīng)的jar包
????????可以發(fā)現(xiàn)第三方Starter都會有?META-INF文件夾,并且META-INF文件夾里面肯定也會有spring.factorie文件。下面是mybatis的spring.factorie文件里面的內(nèi)容。
????????
org.springframework.boot.autoconfigure.EnableAutoConfiguration是key值,固定的寫法。
里面的value值定義了配置類,mybatis定義的配置類有:
MybatisLanguageDriverAutoConfiguration
MybatisAutoConfiguration
MybatisDependsOnDatabaseInitializationDetector
?4.3、ConditionalOn.....注解決定了哪些方法返回值放入Spring容器中
? ? ? ? 打開4.2中找到的MybatisLanguageDriverAutoConfiguration配置類。
????????可以發(fā)現(xiàn)?MybatisLanguageDriverAutoConfiguration類肯定被@Configuration注解定義了,那是不是這個(gè)類所有加了@Bean注解的方法的返回值都會放入Spring容器中完成自動裝配呢?
? ? ? ? ?可以發(fā)現(xiàn)MybatisLanguageDriverAutoConfiguration類中的很多方法上面加了類似@ConditionalOnClass、@ConditionalOnMissingBean等注解,都是限制條件,所以并不是所有的加了@Bean注解的方法的返回值都會放入Spring容器中。
?
?
??總結(jié):
1、 指定的配置類中并不是所有的加了@Bean注解的方法的返回值都會放入Spring容器中。
2、?@ConditionalOnClass、@ConditionalOnMissingBean等注解,都是限制條件。
?
五、自動裝配原理總結(jié)
? ? ? ? 通過@EnableAutoConfiguration注解,會去找到第三方j(luò)ar包中META-INF文件夾里面的spring.factorie文件。
????????spring.factorie文件里面指定了配置類,再找到配置類中加了@Bean注解的方法,再找到能通過@ConditionalOnClass、@ConditionalOnMissingBean等注解的限制條件后,就會將方法返回值放入Spring的容器中。
原文鏈接:https://blog.csdn.net/m0_68201836/article/details/135849676
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2022-04-05 提示:不建議在沒有為偏離分支指定合并策略時(shí)執(zhí)行 pull 操作。 您可以在執(zhí)行下一次
- 2022-05-11 在?.NET?平臺使用?ReflectionDynamicObject?優(yōu)化反射調(diào)用的代碼詳解_實(shí)用
- 2023-06-16 Golang調(diào)用FFmpeg轉(zhuǎn)換視頻流的實(shí)現(xiàn)_Golang
- 2023-04-02 GoLang調(diào)用鏈可視化go-callvis使用介紹_Golang
- 2023-02-15 Go?Comparable?Type原理深入解析_Golang
- 2022-08-25 R語言行篩選的方法之filter函數(shù)詳解_R語言
- 2022-09-16 Python中的?No?Module?named?***問題及解決_python
- 2022-08-30 如何解決React?useEffect鉤子帶來的無限循環(huán)問題_React
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支