自動裝配原理
使用方式
springboot組件中,starter組件都已經(jīng)封裝好了,ioc容器中已經(jīng)有了,開箱即用
組件類型
spring官方的項(xiàng)目 spring-boot-starter-xxx 如web/test...
自定義提供的組件 xxx-spring-boot-starter 如mybatis,dubbo
思考
spring ioc容器中已有,
肯定是已經(jīng)加載了該類,
要么是注入的類中直接使用了注解,ioc掃描到加載;要么就是使用了xml/configuration/import等注解間接加載進(jìn)來。spring大概就這么幾種加載方式
spring中使用import的方式,通過enable方式自動裝配。
實(shí)現(xiàn)方式
1.@EnableAutoConfiguration
這個注解就聲明在@SpringBootApplication中,這個注解就是把組件相關(guān)的Bean加載到ioc容器中2.進(jìn)去發(fā)現(xiàn)@Import注解
@Import(AutoConfigurationImportSelector.class)
這個注解會加載一個配置類,解析配置加載需要的類;這個注解中需要指定配置類,配置類實(shí)現(xiàn)了ImportSelector接口,實(shí)現(xiàn)selectImports(),該方法返回一個數(shù)組,數(shù)組是需要被加載的類。
@AutoConfigurationPackage
這個注解是把使用了該注解的類所在的包及子包下所有組件掃描到ioc容器中
springboot中的實(shí)現(xiàn)
實(shí)現(xiàn)沒有走AutoConfigurationImportSelector中的selectImports(),而是用到了springFactoriesLoader,springFactoriesLoader類似java中的spi,是spring內(nèi)部約定俗成的加載方式,掃描classpath下的META-INF/spring.factories文件,其中是k-v配置,k就是EnableAutoConfiguration,v就是多個配置類,也就是需要自動裝配的配置類
springfactoriesLoader配置文件如:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\.....\org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
需要自動裝配的配置類如:
RabbitAutoConfiguration,是一個基于javaConfig形式的配置類
@Configuration(proxyBeanMethods=false)
@ConfitionOnClass({RabbitTemplate.calss,Channel.calss})
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.calss)
public class RabbitAutoConfiguration
用到了幾個新注解
- ConditionOnClass
根據(jù)條件裝配,這是@Conditional在springboot中的新注解,還有如@ConditionOnBean/OnMissingBean/OnProperty/OnResource...
意思在有這個bean時才加載,因?yàn)閟tarter組件一般不是重復(fù)造輪子,而是再次封裝已有的組件進(jìn)行自動裝配,所以如果沒有加載成功需要的核心類,就沒必要裝載starter的配置類。 - @EnableConfigurationProperties
這個注解指定組件的配置文件,使用了java類配置,一般這個java類會使用@ConfigurationProperties,注解會把當(dāng)前類下的屬性和配置文件中的配置進(jìn)行綁定(如application.properies),所以引用了組件,配置文件寫在主配置文件中既可以讀取、啟動。
使用自動裝配的組件
- 引入maven依賴
- 配置需要的屬性
- 直接注入使用