在SpringBoot 中常见的AutoConfiguration 注解配置

1,684 阅读1分钟

相较于Spring @import 加载Bean,使用SpringBoot 的SPI 机制可以更灵活的加载、配置一个Bean,于是我搜集了一下常见框架对于Spring.factories 中Bean 的配置,用来参考学习。

dubbo

DubboRelaxedBinding2AutoConfiguration

dubbo-spring-boot-autoconfigure-2.7.7.jar!/META-INF/spring.factories

@Configuration
@ConditionalOnProperty(
    prefix = "dubbo",
    name = {"enabled"},
    matchIfMissing = true
)
@ConditionalOnClass(
    name = {"org.springframework.boot.context.properties.bind.Binder"}
)
@AutoConfigureBefore({DubboRelaxedBindingAutoConfiguration.class})
public class DubboRelaxedBinding2AutoConfiguration {
   ……
}

DubboAutoConfiguration

dubbo-spring-boot-autoconfigure-compatible-2.7.7.jar!/META-INF/spring.factories

@ConditionalOnProperty(
    prefix = "dubbo",
    name = {"enabled"},
    matchIfMissing = true
)
@Configuration
@AutoConfigureAfter({DubboRelaxedBindingAutoConfiguration.class})
@EnableConfigurationProperties({DubboConfigurationProperties.class})
@Import({ServiceBeanIdConflictProcessor.class})
public class DubboAutoConfiguration {
    ……
}

MyBatis

MybatisAutoConfiguration

mybatis-spring-boot-autoconfigure-2.1.3.jar!/META-INF/spring.factories

@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties({MybatisProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class})
public class MybatisAutoConfiguration implements InitializingBean {
    ……
}

Druid

DruidDataSourceAutoConfigure

druid-spring-boot-starter-1.1.22.jar!/META-INF/spring.factories

@Configuration
@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
    ......
}

DynamicDatasource

DynamicDataSourceAutoConfiguration

dynamic-datasource-spring-boot-starter-3.1.0.jar!/META-INF/spring.factories

@Slf4j
@Configuration
@AllArgsConstructor
@EnableConfigurationProperties(DynamicDataSourceProperties.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@Import(value = {DruidDynamicDataSourceConfiguration.class, DynamicDataSourceCreatorAutoConfiguration.class})
@ConditionalOnProperty(prefix = DynamicDataSourceProperties.PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
public class DynamicDataSourceAutoConfiguration {
    ......
}

出现频率高的几个注解

ConditionalOnProperty

@ConditionalOnProperty( prefix = "dubbo", name = {"enabled"}, matchIfMissing = true )
作用是判断一个Property属性,是否符合我们的条件,符合则让该注解修饰的类或者方法生效,否则不生效. 我们在Spring Boot中可以通过@ConditionalOnProperty来控制Configuration配置类是否生效

ConditionalOnClass/ConditionalOnSingleCandidate

@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
ConditionalOnClass 表示指定class 存在时,Bean才会被创建。ConditionalOnSingleCandidate 表示指定的class 实例只有一个时,Bean才会被创建

AutoConfigureBefore/AutoConfigureAfter

@AutoConfigureBefore({DataSourceAutoConfiguration.class})
表示指定的class 会在Bean加载之前(Before)或之后(After)被加载

EnableConfigurationProperties

@EnableConfigurationProperties({MybatisProperties.class})
用springboot开发的过程中,我们会用到 @ConfigurationProperties注解,主要是用来把properties或者yml配置文件转化为bean来使用的,而 @EnableConfigurationProperties注解的作用是@ConfigurationProperties注解生效。

Import

@Import({DruidSpringAopConfiguration.class,})
加载创建指定的class,如果当前Bean 不被加载的话,Import 指定的class也不会被加载创建