SpringBoot之自動(dòng)裝配原理及解讀
SpringBoot自動(dòng)裝配原理
spring支持兩種bean的配置方式
基于xml文件和JavaConfig
主啟動(dòng)類上的注解@SpringBootApplication

@SpringBootApplication里有三個(gè)重要注解

@SpringBootConfiguration
- 作用: 聲明定義Bean,嵌套了@Component組件
@SpringBootConfiguration源碼是@Configuration:表示該類為主配置類,可用來(lái)裝配bean
@Configuration的源碼是@Component:說(shuō)明Spring的配置類也是Spring的一個(gè)組件。

它是JavaConfig形式的基于Spring IOC容器的配置類使用的一種注解。SpringBoot本質(zhì)上就是一個(gè)Spring應(yīng)用,通過(guò)這個(gè)注解來(lái)加載IOC容器的配置。所以在啟動(dòng)類里面標(biāo)注了@Configuration,意味著它也是一個(gè)IOC容器的配置類
@ComponentScan
- 作用:掃描主配置類包的所有包下的類,相當(dāng)于xml配置文件中的context:component-scan。eg:pojo中的User類
@EnableAutoConfiguration(重點(diǎn)?。。。?/h3>
- 作用:開啟自動(dòng)裝配類
@EnableAutoConfiguration里有兩個(gè)重要注解

@AutoConfigurationPackage:自動(dòng)配置包
- 作用:給Spring容器中導(dǎo)入一個(gè)Registrar注冊(cè)器組件

@AutoConfigurationPackage和@ComponentScan一樣,也是將主配置類所在的包及其子包里面的組件掃描到IOC容器中,但是區(qū)別是
- @AutoConfigurationPackage掃描@Enitity、@MapperScan等第三方依賴的注解
- @ComponentScan只掃描@Controller/@Service/@Component/@Repository這些常見注解。所以這兩個(gè)注解掃描的對(duì)象是不一樣的。
@Import(AutoConfigurationImportSelector.class)——核心注解
作用:通過(guò)import導(dǎo)入第三方提供的bean的配置類:AutoConfigurationImportSelector:給容器中導(dǎo)入組件
該類中有selectImports()方法,調(diào)用了getAutoConfigurationEntry()

其下又調(diào)用了getCandidateConfigurations()

getCandidateConfigurations()中SpringFactoriesLoader.loadFactoryNames()方法

SpringFactoriesLoader.loadFactoryNames()中傳入?yún)?shù)EnableAutoConfiguration.class

作用:掃描所有jar包類路徑下的META-INF/spring.factories文件,將掃描到的這些文件包裝成properties對(duì)象,從properties中獲取到EnableAutoConfiguration.class類名對(duì)應(yīng)的值,將這些值添加到容器中,用這些類做自動(dòng)配置功能
在spring-boot-autoconfigure-.jar包中找到spring.factories文件

其中spring.factories文件是一組組的key=value的形式
key=接口 value=接口實(shí)現(xiàn)類(多個(gè),逗號(hào)隔開)

以HttpEncodingAutoConfiguration為例解釋:

- @Configuration(proxyBeanMethods = false) 表示該類為配置類
- @EnableConfigurationProperties(ServerProperties.class) 將配置文件中設(shè)置的值與properties中的屬性綁定,將組件添加到IOC容器
- @Conditionalxxx:若滿足不同的條件,則配置類中的配置生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) @ConditionalOnClass(CharacterEncodingFilter.class) @ConditionalOnProperty(prefix = “server.servlet.encoding”, value = “enabled”, matchIfMissing = true)

其中ServerProperties.class中的屬性值,可與xx.yaml配置文件綁定并修改
精髓:根據(jù)當(dāng)前配置類的條件判斷配置類是否生效,若生效,則添加各種組件,會(huì)從properties類中獲取屬性,可以在配置文件xxx.yaml中設(shè)置屬性的值
- Properties類:封裝配置文件的相關(guān)屬性。
- AutoConfiguration類:自動(dòng)配置類,添加到IOC容器中。
SpringFactoriesLoader
作用:從classpath/META-INF/spring.factories文件中,根據(jù)key來(lái)加載對(duì)應(yīng)的類到spring IOC容器中。
自動(dòng)裝配過(guò)程
- 通過(guò)各種注解實(shí)現(xiàn)了類與類之間的依賴關(guān)系,容器在啟動(dòng)的時(shí)候SpringApplication.run(),調(diào)用EnableAutoConfigurationImportSelector.class的selectImports方法
- selectImports方法調(diào)用SpringFactoriesLoader.loadFactoryNames方法掃描jar包類路徑下的META-INF/spring.factories文件下,獲取BeanConfiguration列表
- loadFactoryNames方法會(huì)讀取spring.factories中EnableAutoConfiguration.class類名對(duì)應(yīng)的值
- 根據(jù)這些類上的注解判斷,若條件滿足,則該配置類生效,將配置文件中自己設(shè)置的屬性值配置到對(duì)應(yīng)的配置類中,最后注入到IOC容器中實(shí)現(xiàn)自動(dòng)配置
總結(jié)
SpringBoot啟動(dòng)的時(shí)候通過(guò)@EnableAutoConfiguration注解找到META-INF/spring.factories文件中的所有自動(dòng)配置類,并對(duì)其加載,這些自動(dòng)配置類都是以AutoConfiguration結(jié)尾來(lái)命名的。
它實(shí)際上就是一個(gè)JavaConfig形式的IOC容器配置類,通過(guò)以Properties結(jié)尾命名的類中取得在全局配置文件中配置的屬性,如server.port。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
手把手教你SpringBoot快速集成Swagger的配置過(guò)程
這篇文章主要介紹了手把手教你SpringBoot快速集成Swagger的配置過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
HashMap底層數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析
這篇文章主要介紹了HashMap底層數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析,HashMap作為開發(fā)中常用的數(shù)據(jù)結(jié)構(gòu),也是面試中經(jīng)常被問(wèn)的知識(shí)點(diǎn),因此作為開發(fā)者應(yīng)該盡可能多的理解其底層的數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下2023-11-11
SpringMVC中處理靜態(tài)資源的過(guò)程詳解
本文給大家介紹SpringMVC中處理靜態(tài)資源的過(guò)程,結(jié)合示例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11
Java異常java.lang.UnsatisfiedLinkError: no opencv_ja
這篇文章主要介紹了Java異常java.lang.UnsatisfiedLinkError: no opencv_java320 in java.library.path的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
java Person,Student,GoodStudent 三個(gè)類的繼承、構(gòu)造函數(shù)的執(zhí)行
這篇文章主要介紹了java Person,Student,GoodStudent 三個(gè)類的繼承、構(gòu)造函數(shù)的執(zhí)行,需要的朋友可以參考下2017-02-02

