早期的Spring项目需求增加需求装备繁琐的xml,比如MVC、业务、数据库连接等繁琐的装备。Spring Boot的出现就无需这些繁琐的装备,由于Spring Boot基于约好大于装备的理念,在项目发动时候,将约好的装备类主动装备到IOC容器里。这些都由于Spring Boot有主动装备的特性。

Sping Boot 怎么完成主动装备

Spring Boot都需求创建一个mian发动类,而发动类都含有@SpringBootApplication注解,从发动类,一步步探究源码。

@SpringBootApplication注解

Spring Boot 发动类上都有一个 @SpringBootApplication注解:

SpringBoot 自动装配原理

@EnableAutoConfiguration注解

@SpringBootApplication 里边有 @EnableAutoConfiguration 的注解:

SpringBoot 自动装配原理

AutoConfigurationImportSelector类

@EnableAutoConfiguration注解导入AutoConfigurationImportSelector类:

SpringBoot 自动装配原理

selectImports()办法

AutoConfigurationImportSelector类找到 selectImports 办法,里边有getAutoConfigurationEntry办法:

SpringBoot 自动装配原理

SpringFactoriesLoader.loadFactoryNames() 办法

getAutoConfigurationEntry办法经过SpringFactoriesLoader.loadFactoryNames() 扫描一切含有META-INF/spring.factoriesjar包:

SpringBoot 自动装配原理

SpringBoot 自动装配原理

SpringBoot 自动装配原理

SpringBoot 自动装配原理

spring-boot-autoconfigure-xxx.jar项目包括META-INF/spring.factories文件,spring.factories是一个键值对的办法,扫描该文件下@EnableAutoConfiguration对应类:

SpringBoot 自动装配原理

主动装备主要由@EnableAutoConfiguration完成,增加了@EnableAutoConfiguration注解,会导入AutoConfigurationImportSelector类,里边的selectImports办法经过SpringFactoriesLoader.loadFactoryNames()扫描一切含有META-INF/spring.factoriesjar包,将对应key@EnableAutoConfiguration注解全名对应的value类全部装配到IOC容器中。

Debug 验证

打开Debug调式形式,在getCandidateConfigurations办法里边的SpringFactoriesLoader.loadFactoryNames()处设置断点,检查返回的configurations集合:

SpringBoot 自动装配原理

第一个元素是tk.mybatis.mapper.autoconfigure.MapperAutoConfiguration是由于引入了通用mapper的依靠:

SpringBoot 自动装配原理

主动装备原理

原理流程汇总

从上面检查的源码,能够知道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容器中。
  • 主动装配简单来说便是主动将第三方的组件的bean装载到IOC容器内,不需求再去写bean相关的装备,符合约好大于装备理念。
  • Spring Boot基于约好大于装备的理念,装备假如没有额外的装备的话,就给依照默认的装备运用约好的默认值,依照约好装备到IOC容器中,无需开发人员手动增加装备,加速开发效率。

觉得不错的话,点个赞吧!

SpringBoot 自动装配原理