早期的
Spring
项目需求增加需求装备繁琐的xml
,比如MVC
、业务、数据库连接等繁琐的装备。Spring Boot
的出现就无需这些繁琐的装备,由于Spring Boot
基于约好大于装备的理念,在项目发动时候,将约好的装备类主动装备到IOC
容器里。这些都由于Spring Boot
有主动装备的特性。
Sping Boot 怎么完成主动装备
Spring Boot
都需求创建一个mian
发动类,而发动类都含有@SpringBootApplication
注解,从发动类,一步步探究源码。
@SpringBootApplication注解
Spring Boot
发动类上都有一个 @SpringBootApplication
注解:
@EnableAutoConfiguration注解
@SpringBootApplication
里边有 @EnableAutoConfiguration
的注解:
AutoConfigurationImportSelector类
@EnableAutoConfiguration
注解导入AutoConfigurationImportSelector
类:
selectImports()办法
AutoConfigurationImportSelector
类找到 selectImports
办法,里边有getAutoConfigurationEntry
办法:
SpringFactoriesLoader.loadFactoryNames() 办法
getAutoConfigurationEntry
办法经过SpringFactoriesLoader.loadFactoryNames()
扫描一切含有META-INF/spring.factories
的jar
包:
spring-boot-autoconfigure-xxx.jar
项目包括META-INF/spring.factories
文件,spring.factories
是一个键值对的办法,扫描该文件下@EnableAutoConfiguration
对应类:
主动装备主要由
@EnableAutoConfiguration
完成,增加了@EnableAutoConfiguration
注解,会导入AutoConfigurationImportSelector
类,里边的selectImports
办法经过SpringFactoriesLoader.loadFactoryNames()
扫描一切含有META-INF/spring.factories
的jar
包,将对应key
为@EnableAutoConfiguration
注解全名对应的value
类全部装配到IOC
容器中。
Debug 验证
打开Debug
调式形式,在getCandidateConfigurations
办法里边的SpringFactoriesLoader.loadFactoryNames()
处设置断点,检查返回的configurations
集合:
第一个元素是tk.mybatis.mapper.autoconfigure.MapperAutoConfiguration
是由于引入了通用mapper
的依靠:
主动装备原理
原理流程汇总
从上面检查的源码,能够知道Spring Boot
主动装备主要是@EnableAutoConfiguration
完成的,@EnableAutoConfiguration
注解导入AutoConfigurationImportSelector
类,经过selectImports
办法调用SpringFactoriesLoader.loadFactoryNames()
扫描一切含有META-INF/spring.factories
文件的jar
包,将spring.factories
文件中@EnableAutoConfiguration
对应的类注入到IOC
容器中。
这些属性主动装备到IOC
之后就无需自己手动装备bean
了,Spring Boot
中的约好大于装备
理念,约好是将需求的装备以约好的办法增加到IOC
容器中。
主动装备生效条件
那是不是spring.factories
文件对应的装备都会加载到IOC
容器中?比如下面的Kafka
主动装备类:
@Configuration
@ConditionalOnClass(KafkaTemplate.class)
@EnableConfigurationProperties(KafkaProperties.class)
@Import({ KafkaAnnotationDrivenConfiguration.class, KafkaStreamsAnnotationDrivenConfiguration.class })
public class KafkaAutoConfiguration {
private final KafkaProperties properties;
private final RecordMessageConverter messageConverter;
public KafkaAutoConfiguration(KafkaProperties properties, ObjectProvider<RecordMessageConverter> messageConverter) {
this.properties = properties;
this.messageConverter = messageConverter.getIfUnique();
}
@Bean
@ConditionalOnMissingBean(KafkaTemplate.class)
public KafkaTemplate<?, ?> kafkaTemplate(ProducerFactory<Object, Object> kafkaProducerFactory,
ProducerListener<Object, Object> kafkaProducerListener) {
....
}
其中有几个注解:
@ConditionalOnClass
@ConditionalOnMissingBean
-
@ConditionalOnClass
表明在类途径中存在类才会装备该装备类。只要引入相关依靠才会主动装备该装备类。 -
@ConditionalOnMissingBean
表明只要不存在对应的类的bean
才会主动装备该类。
所以spring.factories
里边并不是一切的bean
都会装配到IOC
容器中,只会按需装备对应的bean
。
总结
-
Spring Boot
主动装备原理- 1、
@EnableAutoConfiguration
注解导入AutoConfigurationImportSelector
类。 - 2、执行
selectImports
办法调用SpringFactoriesLoader.loadFactoryNames()
扫描一切jar
下面的对应的META-INF/spring.factories
文件. - 3、限定为
@EnableAutoConfiguration
对应的value
,将这些装配条件的装配到IOC
容器中。
- 1、
- 主动装配简单来说便是主动将第三方的组件的
bean
装载到IOC
容器内,不需求再去写bean
相关的装备,符合约好大于装备理念。 -
Spring Boot
基于约好大于装备的理念,装备假如没有额外的装备的话,就给依照默认的装备运用约好的默认值,依照约好装备到IOC
容器中,无需开发人员手动增加装备,加速开发效率。
觉得不错的话,点个赞吧!