《springboot-自动化配置》 中讲解了 springboot 自动化配置原理。

一、案例需求

日常开发中,存在有共享 jar 依赖,当项目引用该 依赖时,会对已经配置好的配置类进行自动配置,使得配置能够重复利用,简化配置。

二、官方说明

官方对自动配置类的相关说明

Under the hood, auto-configuration is implemented with standard @Configuration classes. Additional @Conditionalannotations are used to constrain when the auto-configuration should apply. Usually auto-configuration classes use @ConditionalOnClass and @ConditionalOnMissingBean annotations. This ensures that auto-configuration only applies when relevant classes are found and when you have not declared your own@Configuration. You can browse the source code of spring-boot-autoconfigure to see the @Configuration classes that we provide (see theMETA-INF/spring.factories file).

大体翻译如下:

1、自动配置类继承自标准的 注解 @Configuration 。 2、通过 @Conditional,进行驱动,而通常的 @Conditional 驱动,主要为 @ConditionalOnClass@ConditionalOnMissingBean。这两个注解保证了在你没有显示声明配置的时候,实现自动注入的功能 3、我们可以在 spring-boot-autoconfigure 中找到相关的自动配置类。 4、这些配置类,其实主要根据我声明定义的 META-INF/spring.factories 进行查找。

通过官方对于自动配置的先关说明能够得出自定义一个自动配置类的步骤

  • 1、定义配置文件,并加上注解 @Configuration
  • 2、在 META-INF/spring.factories 中配置定义好的配置文件的全路径名

在以上两种操作下,还可以通过使用 @Conditional 类的驱动,对自动配置类进行更灵活的配置。

如: @ConditionalOnMissingBean的组合配置

  1. @Configuration
  2. @ConditionalOnMissingBean(DistributedTransactionAutoConfig.class)
  3. public class DistributedTransactionAutoConfig {
  4. }

DistributedTransactionAutoConfig 未被配置时,才会进行配置,否则可能导致冲突。

三、实现

code.zip

项目结构如下

01.png

模式一

引用依赖,启动应用程序,直接进行自动配置

step1、定义自动配置类

例如:

  1. @Configuration
  2. @ConditionalOnMissingBean(DistributedTransactionAutoConfig.class)
  3. public class DistributedTransactionAutoConfig {
  4. @Bean
  5. public DistributedTransactionBean distributedTransactionBean(){
  6. return new DistributedTransactionBean();
  7. }
  8. }

step2、在 META-INF 下的 spring.factories 中配置

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2. com.xxx.auto.config.mode1.DistributedTransactionAutoConfig

模式二

引用依赖,需要通过注解的方式才能够开启(开启开关,如@EnableXXX)

step1、定义自动配置类

例如:

  1. public class DistributedLockAutoConfig {
  2. @Bean
  3. public DistributedLockBean distributedLockBean(){
  4. return new DistributedLockBean();
  5. }
  6. }

step2、定义 @EnableXXX 注解(通过 @Import 实现)

例如:

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Import(DistributedLockAutoConfig.class)
  5. public @interface EnableLock {
  6. }