SpringBoot 自动装配原理
早期的
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
容器中,无需开发人员手动添加配置,加快开发效率。
觉得文章不错的话,点个赞吧!
SpringBoot 自动装配原理的更多相关文章
- SpringBoot启动流程分析(五):SpringBoot自动装配原理实现
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- springboot自动装配原理,写一个自己的start
springboot自动装配原理 第一次使用springboot的时候,都感觉很神奇.只要加入一个maven的依赖,写几行配置,就能注入redisTemple,rabbitmqTemple等对象. 这 ...
- SpringBoot自动装配原理解析
本文包含:SpringBoot的自动配置原理及如何自定义SpringBootStar等 我们知道,在使用SpringBoot的时候,我们只需要如下方式即可直接启动一个Web程序: @SpringBoo ...
- springboot自动装配原理
最近开始学习spring源码,看各种文章的时候看到了springboot自动装配实现原理.用自己的话简单概括下. 首先打开一个基本的springboot项目,点进去@SpringBootApplica ...
- SpringBoot | 2.1 SpringBoot自动装配原理
@ 目录 前言 1. 引入配置文件与配置绑定 @ImportResource @ConfigurationProperties 1.1 @ConfigurationProperties + @Enab ...
- 【Springboot】Springboot自动装配原理
1.核心注解就是 EnableAutoConfiguration 该注解会激活SpringBoot的自动装配功能: 代码如下: @Target(ElementType.TYPE) @Retentio ...
- springboot自动装配原理回顾、配置文件分析
配置文件 spring boot官方文档 官方外部配置文件说明参考文档 自动配置原理分析 1. SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfigurat ...
- SpringBoot自动装配原理之Configuration以及@Bean注解的使用
Configuration以及Bean注解的使用 该知识点在Spring中应该学过,没有学过或者遗忘的的朋友需要预习或温习前置知识点.SpringBoot其实就是Spring的进一步简化,所以前置知识 ...
- SpringBoot:带你认认真真梳理一遍自动装配原理
前言 Spring翻译为中文是“春天”,的确,在某段时间内,它给Java开发人员带来过春天,但是随着我们项目规模的扩大,Spring需要配置的地方就越来越多,夸张点说,“配置两小时,Coding五分钟 ...
随机推荐
- java方法---定义,调用
定义,调用 1.方法的定义 方法就是一段用来完成特定功能的代码片段,类似于其它语言的函数. 方法用于定义该类或该类的实例的行为特征和功能实现.方法是类和对象行为特征的抽象. 方法很类似于面向过程中的函 ...
- spring项目中starter包的原理,以及自定义starter包的使用
MAVEN项目中starter的原理 一.原始方式 我们最早配置spring应用的时候,必须要经历的步骤:1.pom文件中引入相关的jar包,包括spring,redis,jdbc等等 2.通过pro ...
- KingbaseESV8R6垃圾回收受到参数old_snapshot_threshold的影响
垃圾回收影响因素 影响垃圾回收的因素有很多,垃圾回收不及时,最直接导致表膨胀,详情查看文档<KingbaseESV8R6 垃圾回收原理以及如何预防膨胀>. vacuum回收垃圾的tuple ...
- KFS replicator安装(Mysql-KES)
源端mysql 一.安装前置配置 1.创建安装用户 groupadd flysync useradd flysync -g flysync -G mysql passwd flysync 2.上传安装 ...
- 一篇文章带你掌握主流数据库框架——MyBatis
一篇文章带你掌握主流数据库框架--MyBatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射. 在之前的文章中我们学习了MYSQL和JDBC,但是这些东西远远不 ...
- 璞华PLM为全场景产品生命周期管理赋能,助力产品主线的企业数字化转型
英文版的<产品生命周期管理(PLM)软件市场--增长.趋势.COVID-19影响和预测(2022 - 2027)>中对未来PLM市场概述的描述为:"产品生命周期管理(PLM)软件 ...
- mocha、chai和supertest单元测试
mocha单元测试 1. 因为有时候在代码中加了新的东西需要反复测试接口 或者 别人要求 重新跑接口非常的繁琐 2. 所有我们需要一个帮我们重复测试的东西 那就是mocha 3. 先下载 一定不要全 ...
- WinUI 3 踩坑记:前言
WinUI 3 (Windows App SDK 于 2021 年 11 月发布了第一个正式版 v1.0.0 [1],最新版本是 v1.1.5 [2].我的基于 WinUI 3 的个人项目 寻空 从年 ...
- Elastic: 如何在阿里云上构建Elastic集群
- Pod的滚动升级过程