1、概览 {#1概览}
Spring Boot 的自动配置功能让配置 Spring 变得更容易。
本文将带你了解 org.springframework.boot.autoconfigure 和 org.springframework.boot.autoconfigure.condition
包中的核心注解。
2、@SpringBootApplication {#2springbootapplication}
使用此注解来标记 Spring Boot 应用的 main 类:
@SpringBootApplication
class VehicleFactoryApplication {
public static void main(String[] args) {
SpringApplication.run(VehicleFactoryApplication.class, args);
}
}
@SpringBootApplication
封装了 @Configuration
、@EnableAutoConfiguration
和 @ComponentScan
注解,均为默认属性。
3、@EnableAutoConfiguration {#3enableautoconfiguration}
@EnableAutoConfiguration
顾名思义就是启用自动配置。这意味着 Spring Boot 会在其 classpath 上查找自动配置 Bean,并自动应用它们。
注意,必须将此注解与 @Configuration
一起使用:
@Configuration
@EnableAutoConfiguration
class VehicleFactoryConfig {}
4、自动配置的条件注解 {#4自动配置的条件注解}
通常,在编写自定义自动配置时,我们希望 Spring 有条件地使用它们。这可以通过本节中的注解来实现这一目标。
可以将本节中的注解放在 @Configuration
类或 @Bean
方法上。
4.1、@ConditionalOnClass 和 @ConditionalOnMissingClass {#41conditionalonclass-和-conditionalonmissingclass}
只有注解参数中的类存在/不存在时,Spring 才会使用标记的自动配置 Bean:
@Configuration
@ConditionalOnClass(DataSource.class)
class MySQLAutoconfiguration {
//...
}
4.2、@ConditionalOnBean 和 @ConditionalOnMissingBean {#42conditionalonbean-和-conditionalonmissingbean}
当需要根据特定 Bean 的存在或不存在来定义条件时,可以使用这俩注解:
@Bean
@ConditionalOnBean(name = "dataSource")
LocalContainerEntityManagerFactoryBean entityManagerFactory() {
// ...
}
4.3、@ConditionalOnProperty {#43conditionalonproperty}
通过该注解,可以为属性值设定条件:
@Bean
@ConditionalOnProperty(
name = "usemysql",
havingValue = "local"
)
DataSource dataSource() {
// ...
}
4.4、@ConditionalOnResource {#44conditionalonresource}
可以让 Spring 仅在特定资源存在时才使用 Bean 定义:
@ConditionalOnResource(resources = "classpath:mysql.properties")
Properties additionalProperties() {
// ...
}
4.5、@ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication {#45conditionalonwebapplication--和-conditionalonnotwebapplication}
通过这些注解,可以根据当前应用是否为 Web 应用来创建条件:
@ConditionalOnWebApplication
HealthCheckController healthCheckController() {
// ...
}
4.6、@ConditionalExpression {#46conditionalexpression}
可以在更复杂的情况下使用此注解。当 SpEL 表达式求值为 true
时,Spring 将使用标记的 Bean 定义:
@Bean
@ConditionalOnExpression("${usemysql} && ${mysqlserver == 'local'}")
DataSource dataSource() {
// ...
}
4.7、@Conditional {#47conditional}
对于更复杂的条件,可以创建一个 Condition
接口的实现类来评估自定义条件。
通过 @Conditional
注解指定自定义条件类:
@Conditional(HibernateCondition.class)
Properties additionalProperties() {
//...
}
随着 Spring Boot 的更新迭代,预定义的 @Conditional
注解也越来越多。你可以参阅 中文文档 来了解。
5、总结 {#5总结}
本文介绍了 Spring Boot 中的 @SpringBootApplication
注解和 @EnableAutoConfiguration
注解以及众多的 @Conditional
条件注解。
Ref:https://www.baeldung.com/spring-boot-annotations