SpringBoot自动配置原理

2020-06-15  本文已影响0人  Timor小先生

一、前言

Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器。

二、原理

1、springboot 的启动类中@SpringBootApplication  里面包含了@EnableAutoConfiguration,就是自动配置的注解。

2、@EnableAutoConfiguration作用:开启自动配置功能。

@EnableAutoConfiguration底层使用@AutoConfigurationPackage+@import注解

@EnableAutoConfiguration

(1)、@AutoConfigurationPackage注解,底层使用@import(AutoConfigurationPackages.Registrar.class)注解,导入Registrar到IOC容器,作用是将主配置类(@SpringBootApplication标注的类)所在包及下面所有子包的所有组件扫面到spring 容器里。

@AutoConfigurationPackage 扫描主配置类下的包及子包

(2)、@import(EnableAutoConfigurationImportSelector.class)注解,导入EnableAutoConfigurationImportSelector到IOC容器,目的是为了给容器导入一些组件,其父类AutoConfigurationImportSelector的selectImports方法可导入组件,路径是META-INF/spring.factories下。

扫描spring.factories过程

List configurations = getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置,利用SpringFactoriesLoader.loadFactoryNames()扫描所有jar包类路径下 META-INF/spring.factories(找到xxxAutoConfiguration),把扫描到的这些文件的内容包装成properties对象,从properties对象中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中。

3、每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置,自动配置类必须在一定条件下才能生效( @ConditionalOnxxxxxx),举以下几个例子。

@Conditional派生类

实际应用MQ:

@Configuration

@ConditionalOnClass({ RabbitTemplate.class, Channel.class })

@EnableConfigurationProperties(RabbitProperties.class)

@Import(RabbitAnnotationDrivenConfiguration.class)

public class RabbitAutoConfiguration {

三、写在最后

今天是2020年6月15日,北京的疫情形式依旧严峻,小区又恢复了出入测温,出入证检查等政策,炎炎夏日工作人员实属不易,没经历过战争,永远不知道战争的残酷。最后,期待万事终将无恙!

上一篇 下一篇

猜你喜欢

热点阅读