Spring Boot 注解

1、概览

Spring Boot 的自动配置功能让配置 Spring 变得更容易。

本文将带你了解 org.springframework.boot.autoconfigure 和 org.springframework.boot.autoconfigure.condition 包中的核心注解。

2、@SpringBootApplication

使用此注解来标记 Spring Boot 应用的 main 类:

@SpringBootApplication
class VehicleFactoryApplication {

    public static void main(String[] args) {
        SpringApplication.run(VehicleFactoryApplication.class, args);
    }
}

@SpringBootApplication 封装了 @Configuration@EnableAutoConfiguration@ComponentScan 注解,均为默认属性。

3、@EnableAutoConfiguration

@EnableAutoConfiguration 顾名思义就是启用自动配置。这意味着 Spring Boot 会在其 classpath 上查找自动配置 Bean,并自动应用它们。

注意,必须将此注解与 @Configuration 一起使用:

@Configuration
@EnableAutoConfiguration
class VehicleFactoryConfig {}

4、自动配置的条件注解

通常,在编写自定义自动配置时,我们希望 Spring 有条件地使用它们。这可以通过本节中的注解来实现这一目标。

可以将本节中的注解放在 @Configuration 类或 @Bean 方法上。

4.1、@ConditionalOnClass 和 @ConditionalOnMissingClass

只有注解参数中的类存在/不存在时,Spring 才会使用标记的自动配置 Bean:

@Configuration
@ConditionalOnClass(DataSource.class)
class MySQLAutoconfiguration {
    //...
}

4.2、@ConditionalOnBean 和 @ConditionalOnMissingBean

当需要根据特定 Bean 的存在或不存在来定义条件时,可以使用这俩注解:

@Bean
@ConditionalOnBean(name = "dataSource")
LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    // ...
}

4.3、@ConditionalOnProperty

通过该注解,可以为属性值设定条件:

@Bean
@ConditionalOnProperty(
    name = "usemysql", 
    havingValue = "local"
)
DataSource dataSource() {
    // ...
}

4.4、@ConditionalOnResource

可以让 Spring 仅在特定资源存在时才使用 Bean 定义:

@ConditionalOnResource(resources = "classpath:mysql.properties")
Properties additionalProperties() {
    // ...
}

4.5、@ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication

通过这些注解,可以根据当前应用是否为 Web 应用来创建条件:

@ConditionalOnWebApplication
HealthCheckController healthCheckController() {
    // ...
}

4.6、@ConditionalExpression

可以在更复杂的情况下使用此注解。当 SpEL 表达式求值为 true 时,Spring 将使用标记的 Bean 定义:

@Bean
@ConditionalOnExpression("${usemysql} && ${mysqlserver == 'local'}")
DataSource dataSource() {
    // ...
}

4.7、@Conditional

对于更复杂的条件,可以创建一个 Condition 接口的实现类来评估自定义条件。

通过 @Conditional 注解指定自定义条件类:

@Conditional(HibernateCondition.class)
Properties additionalProperties() {
    //...
}

随着 Spring Boot 的更新迭代,预定义的 @Conditional 注解也越来越多。你可以参阅 中文文档 来了解。

5、总结

本文介绍了 Spring Boot 中的 @SpringBootApplication 注解和 @EnableAutoConfiguration 注解以及众多的 @Conditional 条件注解。


Ref:https://www.baeldung.com/spring-boot-annotations