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

SpringBoot 自动装配原理

时间:2022-11-06 00:55:37浏览次数:53  
标签:装配 SpringBoot spring 配置 Boot EnableAutoConfiguration Spring 原理 IOC

早期的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.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<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,配置,Boot,EnableAutoConfiguration,Spring,原理,IOC
From: https://www.cnblogs.com/jeremylai7/p/16860884.html

相关文章

  • 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={......
  • SpringBoot02-对yaml的介绍(配置环境)
    一、SpringBoot配置文件的分类和优先级配置的介绍:yaml二、介绍yaml格式1-他和其他传统格式的不同2-yaml的基本语法3-yaml数据格式代码块解析:server:port:80......
  • 随机森林算法原理
    随机森林算法原理:随机森林是从原始训练样本集N中有放回地重复随机抽取k个样本生成新的训练样本集合,然后根据自助样本集生成k个分类树组成随机森林,新数据的分类结果按分......
  • LeakCannary 的主要原理
    大概可以分为以下几步:((1)监测Activity的生命周期的onDestroy()的调用。(2)当某个Activity的onDestroy()调用后,便对这个activity创建一个带ReferenceQueue的......