首页 > 其他分享 >SpringBoot 自动装配原理

SpringBoot 自动装配原理

时间:2022-11-06 11:36:29浏览次数:52  
标签:装配 SpringBoot spring 配置 EnableAutoConfiguration 注解 原理 factories IOC

Sping Boot 如何实现自动配置

​Spring Boot​​都需要创建一个​​mian​​启动类,而启动类都含有​​@SpringBootApplication​​注解,从启动类,一步步探索源码。

@SpringBootApplication注解

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

SpringBoot 自动装配原理_kafka

@EnableAutoConfiguration注解

​@SpringBootApplication​​ 里面有 ​​@EnableAutoConfiguration​​ 的注解:

SpringBoot 自动装配原理_spring_02

AutoConfigurationImportSelector类

​@EnableAutoConfiguration​​注解导入​​AutoConfigurationImportSelector​​类:

SpringBoot 自动装配原理_jar_03

selectImports()方法

​AutoConfigurationImportSelector​​类找到 ​​selectImports​​ 方法,里面有​​getAutoConfigurationEntry​​方法:

SpringBoot 自动装配原理_kafka_04

SpringFactoriesLoader.loadFactoryNames() 方法

​getAutoConfigurationEntry​​方法通过​​SpringFactoriesLoader.loadFactoryNames()​​ 扫描所有含有​​META-INF/spring.factories​​的​​jar​​包:

SpringBoot 自动装配原理_kafka_05

SpringBoot 自动装配原理_kafka_06

SpringBoot 自动装配原理_spring_07

SpringBoot 自动装配原理_jar_08

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

SpringBoot 自动装配原理_kafka_09

自动配置主要由​​@EnableAutoConfiguration​​实现,添加了​​@EnableAutoConfiguration​​注解,会导入​​AutoConfigurationImportSelector​​类,里面的​​selectImports​​方法通过​​SpringFactoriesLoader.loadFactoryNames()​​扫描所有含有​​META-INF/spring.factories​​的​​jar​​包,将对应​​key​​为​​@EnableAutoConfiguration​​注解全名对应的​​value​​类全部装配到​​IOC​​容器中。

Debug 验证

打开​​Debug​​调式模式,在​​getCandidateConfigurations​​方法里面的​​SpringFactoriesLoader.loadFactoryNames()​​处设置断点,查看返回的​​configurations​​集合:

SpringBoot 自动装配原理_spring_10

第一个元素是​​tk.mybatis.mapper.autoconfigure.MapperAutoConfiguration​​是因为引入了​​通用mapper​​的依赖:

SpringBoot 自动装配原理_spring_11

自动配置原理

原理流程汇总

从上面查看的源码,可以知道​​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,spring,配置,EnableAutoConfiguration,注解,原理,factories,IOC
From: https://blog.51cto.com/u_15773567/5827228

相关文章

  • HCIA VLAN原理
    一、前言VLAN在网络中常用且重要,我们在用户接入时经常要说的是“给他划个VLAN”,那我们为什么需要VLAN,而VLAN又如何使用呢?本篇先简单说下VLAN的原理,以后再详细介绍。本篇......
  • 计算机网络原理(七):无线网络和移动网络
    概述及无线链路和网络特征WiFi:802.11无线LAN4G-5G通信移动性管理:原理移动性管理:实践无线和移动性:对高层协议的影响通过无线方式连接到因特网的设备有:便携机、智能......
  • SpringBoot 自动装配原理
    早期的Spring项目需要添加需要配置繁琐的xml,比如MVC、事务、数据库连接等繁琐的配置。SpringBoot的出现就无需这些繁琐的配置,因为SpringBoot基于约定大于配置的理念,在......
  • SpringBoot03(读取配置内容)
    SpringBoot读取propriety/yml/yaml配置中的内容3种方法方法1@value@RestControllerpublicclassHelloController{/*@Value("${XXXX}")这个是@Value的固定格式,XX......
  • sonarqube-postgresql-sonar-scanner安装配置linux
    1、上传jdk、sonarqube、postgresql到服务器1.1、jdk11下载1.2、sonarqube下载1.3、postgresql下载2、jdk安装配置#解压tar-zxvfOpenJDK11U-jdk_x64_linux_hotspo......
  • springboot自定义starter集成controller、Dao
    springboot自定义starter集成controller、Dao编写starer,其他服务直接引入既可以,通常步骤为:pom中引入需要的依赖删除spring-boot-maven-plugin插件resources下新建spring.fac......
  • SpringBoot实战笔记:02_使用注解与Java配置的Aop示例
    转载:https://blog.csdn.net/android_zyf/article/details/79579875<!--02_新的依赖--><!--导入spring的aop支持--><dependency><groupId>${spring-groupId}</groupId>......
  • SpringBoot实战笔记:01_Spring中的Java配置
    转载:https://blog.csdn.net/android_zyf/article/details/79579862Spring4.x与SpringBoot都推荐使用Java配置xml配置:将bean的信息配置在xml配置文件中注解配置:在对应的bea......
  • SpringMVC 原理
    1.原理图(实现代表自动装配完成,虚线我们需要实现的地方)   2.实现步骤  3.实现  HelloController.javapackagecom.zxy.contorller;importorg.springfr......
  • SpringBoot报错解决
    1-问题:2022-11-0516:25:09.334ERROR18989---[main]o.s.b.d.LoggingFailureAnalys解决:在java的入口把@SpringBootApplication改成@SpringBootApplication(exclude={......