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

@SpringBootApplication里有三個重要注解

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

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

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

@AutoConfigurationPackage和@ComponentScan一樣,也是將主配置類所在的包及其子包里面的組件掃描到IOC容器中,但是區(qū)別是
- @AutoConfigurationPackage掃描@Enitity、@MapperScan等第三方依賴的注解
- @ComponentScan只掃描@Controller/@Service/@Component/@Repository這些常見注解。所以這兩個注解掃描的對象是不一樣的。
@Import(AutoConfigurationImportSelector.class)——核心注解
作用:通過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對象,從properties中獲取到EnableAutoConfiguration.class類名對應(yīng)的值,將這些值添加到容器中,用這些類做自動配置功能
在spring-boot-autoconfigure-.jar包中找到spring.factories文件

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

以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)前配置類的條件判斷配置類是否生效,若生效,則添加各種組件,會從properties類中獲取屬性,可以在配置文件xxx.yaml中設(shè)置屬性的值
- Properties類:封裝配置文件的相關(guān)屬性。
- AutoConfiguration類:自動配置類,添加到IOC容器中。
SpringFactoriesLoader
作用:從classpath/META-INF/spring.factories文件中,根據(jù)key來加載對應(yīng)的類到spring IOC容器中。
自動裝配過程
- 通過各種注解實(shí)現(xiàn)了類與類之間的依賴關(guān)系,容器在啟動的時候SpringApplication.run(),調(diào)用EnableAutoConfigurationImportSelector.class的selectImports方法
- selectImports方法調(diào)用SpringFactoriesLoader.loadFactoryNames方法掃描jar包類路徑下的META-INF/spring.factories文件下,獲取BeanConfiguration列表
- loadFactoryNames方法會讀取spring.factories中EnableAutoConfiguration.class類名對應(yīng)的值
- 根據(jù)這些類上的注解判斷,若條件滿足,則該配置類生效,將配置文件中自己設(shè)置的屬性值配置到對應(yīng)的配置類中,最后注入到IOC容器中實(shí)現(xiàn)自動配置
總結(jié)
SpringBoot啟動的時候通過@EnableAutoConfiguration注解找到META-INF/spring.factories文件中的所有自動配置類,并對其加載,這些自動配置類都是以AutoConfiguration結(jié)尾來命名的。
它實(shí)際上就是一個JavaConfig形式的IOC容器配置類,通過以Properties結(jié)尾命名的類中取得在全局配置文件中配置的屬性,如server.port。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud-Alibaba-Sentinel服務(wù)降級,熱點(diǎn)限流,服務(wù)熔斷
這篇文章主要介紹了SpringCloud-Alibaba-Sentinel服務(wù)降級,熱點(diǎn)限流,服務(wù)熔斷,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
jenkins-node節(jié)點(diǎn)配置方式解讀
Jenkins通過主從節(jié)點(diǎn)實(shí)現(xiàn)分布式構(gòu)建,支持負(fù)載均衡和特定環(huán)境任務(wù),配置包括標(biāo)簽匹配、啟動方式、環(huán)境變量及工具管理,可參數(shù)化選擇節(jié)點(diǎn)執(zhí)行2025-08-08
更簡單更高效的Mybatis?Plus最新代碼生成器AutoGenerator
這篇文章主要為大家介紹了更簡單更高效的Mybatis?Plus最新代碼生成器AutoGenerator使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
springboot如何通過注解實(shí)現(xiàn)多線程
在Spring Boot中實(shí)現(xiàn)異步方法時,如果直接在調(diào)用類中使用`@Async`注解,可能會導(dǎo)致異步失敗,正確的做法是將實(shí)現(xiàn)異步的方法放在一個獨(dú)立的類中,并通過Spring生成的bean來調(diào)用這個方法,這樣可以成功實(shí)現(xiàn)異步2024-12-12
SpringBoot AOP處理請求日志打印功能代碼實(shí)例
這篇文章主要介紹了SpringBoot AOP處理請求日志打印功能代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
RabbitMQ 的消息持久化與 Spring AMQP 的實(shí)現(xiàn)詳解
這篇文章主要介紹了RabbitMQ 的消息持久化與 Spring AMQP 的實(shí)現(xiàn)剖析詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
RocketMQ中消費(fèi)者的消費(fèi)進(jìn)度管理
這篇文章主要介紹了RocketMQ中消費(fèi)者的消費(fèi)進(jìn)度管理,業(yè)務(wù)實(shí)現(xiàn)消費(fèi)回調(diào)的時候,當(dāng)且僅當(dāng)此回調(diào)函數(shù)返回ConsumeConcurrentlyStatus.CONSUME_SUCCESS ,RocketMQ才會認(rèn)為這批消息(默認(rèn)是1條)是消費(fèi)完成的,需要的朋友可以參考下2023-10-10

