早期的Sping Boot 如何实现自动配置Spring
项目需要添加需要配置繁琐的xml
,比如MVC
、事务、数据库连接等繁琐的配置 。Spring Boot
的出现就无需这些繁琐的配置,因为Spring Boot
基于约定大于配置的理念 , 在项目启动时候,将约定的配置类自动配置到IOC
容器里 。这些都因为Spring 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
对应类:文章插图
自动配置主要由Debug 验证打开@EnableAutoConfiguration
实现,添加了@EnableAutoConfiguration
注解 , 会导入AutoConfigurationImportSelector
类,里面的selectImports
方法通过SpringFactoriesLoader.loadFactoryNames()
扫描所有含有META-INF/spring.factories
的jar
包,将对应key
为@EnableAutoConfiguration
注解全名对应的value
类全部装配到IOC
容器中 。
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) {....}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- springboot整合项目-商城个人头像上传功能
- 自动化利器 Ansible - 从了解到应用
- vs 自定义代码块
- 六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)
- springboot项目整合-注册功能模块开发
- 如何在.NET程序崩溃时自动创建Dump?
- SpringBoot 过滤器和拦截器
- SpringBoot 常用注解的原理和使用
- 之六 2流高手速成记:从SpringBoot到SpringCloudAlibaba
- 三十九 Java开发学习----SpringBoot整合mybatis