Sping Boot 如何实现自动配置
创始人
2024-03-25 22:08:57
0

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.factoriesjar包:

 

 

 

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

 

自动配置主要由@EnableAutoConfiguration实现,添加了@EnableAutoConfiguration注解,会导入AutoConfigurationImportSelector类,里面的selectImports方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有含有META-INF/spring.factoriesjar包,将对应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 messageConverter) {this.properties = properties;this.messageConverter = messageConverter.getIfUnique();}
​@Bean@ConditionalOnMissingBean(KafkaTemplate.class)public KafkaTemplate kafkaTemplate(ProducerFactory kafkaProducerFactory,ProducerListener 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容器中,无需开发人员手动添加配置,加快开发效率。

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...