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五分钟 ...
随机推荐
- [数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习)
[数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习) 在C#中,存在常见的九种集合类型:动态数组ArrayList.列表List.排序列表SortedList.哈希表HashTa ...
- Live2d Widget
写在最前 最早的时候看别人的博客很多都有一个可爱的看板娘,然后就找了教程给自己也整了一个.因为找到的教程都是稂莠不齐的,原作者自己说的也略显含糊(其实是我自己看不懂).总之秉承着一如既往的小白风格.把 ...
- 记一次血淋淋的MySQL崩溃修复案例
摘要:今天给大家带来一篇MySQL数据库崩溃的修复案例 本文分享自华为云社区<记一次MySQL崩溃修复案例,再也不用删库跑路了>,作者: 冰 河. 问题描述 研究MySQL源代码,调试并压 ...
- Jetpack架构组件学习(4)——APP Startup库的使用
最近在研究APP的启动优化,也是发现了Jetpack中的App Startup库,可以进行SDK的初始化操作,于是便是学习了,特此记录 原文:Jetpack架构组件学习(4)--App Startup ...
- KingbaseES wal(xlog) 日志清理故障恢复案例
案例说明: 在通过sys_archivecleanup工具手工清理wal日志时,在control文件中查询的检查点对应的wal日志是"000000010000000000000008&quo ...
- 如何自动清理 KingbaseES SYS_LOG
KingbaseES 初始化完成后,默认不会对 sys_log进行清理.如果需要对sys_log进行自动清理,需要设置相关参数. 与日志自动清理有关的参数(默认值)如下: log_filename | ...
- KingbaseES 逻辑备份还原加密
KingbaseEs 支持在sys_dump备份时使用key进行加密.在sys_restore时,如果没提供key,或者key值不对,将无法进行恢复. [kingbase@dbhost03 ~]$ s ...
- KingbaseES R3 集群主备切换信号量(semctl)错误故障分析案例
案例说明: 某项目KingbaseES R3 一主一备流复制集群在主备切换测试中出现故障,导致主备无法正常切换:由于bm要求,数据库相关日志无法从主机中获取,只能在现场进行分析:通过对比主备切换时的时 ...
- KingabseES 锁机制
KingabseES的锁机制 目录 KingabseES的锁机制 一.前言 二.锁机制 三.表级锁 ( Table-Level Locks ) 1.访问共享(ACCESS SHARE) 2.行共享(R ...
- 手写tomcat——编写一个提供servlet能力的 http服务器
点击查看代码 package com.grady.diytomcat; import com.grady.diytomcat.handler.RequestHandler; import org.do ...