概述
SpringBoot 核心能力之一就是自动配置,SpringBoot之所以可以快速集成Spring组件,是因为它具备自动配置的能力。
本文将探索 org.springframework.boot.autoconfigure 和 org.springframework.boot.autoconfigure.condition 包中的相关注解,这些是实现SpringBoot自动配置的一线工作者。
@SpringBootApplication
我们使用此 @SpringBootApplication注解 来标记 Spring Boot 应用程序的主类:
@SpringBootApplication
class VehicleFactoryApplication {
public static void main(String[] args) {
SpringApplication.run(VehicleFactoryApplication.class, args);
}
}
点击@SpringBootApplication 注解会发现其封装了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 注释。
@EnableAutoConfiguration
@EnableAutoConfiguration,顾名思义,启用自动配置。这意味着 Spring Boot 在其 Classpath 上查找自动配置 bean 并自动应用它们。
请注意,我们必须将此 annotation 与 @Configuration一起使用:
@Configuration
@EnableAutoConfiguration
class VehicleFactoryConfig {
}
条件配置
@ConditionalOnClass 和 @ConditionalOnMissingClass
使用这两个注解,可以实现在指定 class 存在/不存在 的时候自动装配bean。
@Configuration
@ConditionalOnClass(DataSource.class)
class MySQLAutoconfiguration {
//...
}
@ConditionalOnBean 和 @ConditionalOnMissingBean
当我们想根据特定 bean 的存在与否来定义条件时,我们可以使用这些注解:
@Bean
@ConditionalOnBean(name = "dataSource")
LocalContainerEntityManagerFactoryBean entityManagerFactory() {
// ...
}
@ConditionalOnProperty
通过这个注解,我们可以对 properties 的值设置条件装配:
@Bean
@ConditionalOnProperty(
name = "usemysql",
havingValue = "local"
)
DataSource dataSource() {
// ...
}
@ConditionalOnResource
通过这个注解,我们可以对 resource 的值设置条件装配:
@ConditionalOnResource(resources = "classpath:mysql.properties")
Properties additionalProperties() {
// ...
}
@ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication
通过这些注释,我们可以根据当前应用程序是否是 Web 应用程序来创建条件装配:
@ConditionalOnWebApplication
HealthCheckController healthCheckController() {
// ...
}
@ConditionalExpression
我们可以在更复杂的情况下使用这个注解。当 SPEL 表达式被评估为true时, Spring 将使用标记的定义:
@Bean
@ConditionalOnExpression("${usemysql} && ${mysqlserver == 'local'}")
DataSource dataSource() {
// ...
}
@Conditional
对于更复杂的条件,我们可以创建一个评估自定义条件的类。我们告诉 Spring 将此自定义条件与 @Conditional一起使用
@Conditional(HibernateCondition.class)
Properties additionalProperties() {
//...
}
总结
本文阐述了SpringBoot 自动配置原理以及常见的装配bean手段,并提供了在不同使用场景的最佳实践参考。
引用
- https://www.baeldung.com/spring-boot-annotations