Spring Boot 注解

更新于 2025-12-30

Attila Fejér 2018-06-01

1. 概述

Spring Boot 通过其自动配置(auto-configuration)特性,使 Spring 的配置变得更加简单。

在本篇快速教程中,我们将探讨来自 org.springframework.boot.autoconfigureorg.springframework.boot.autoconfigure.condition 包中的注解。

2. @SpringBootApplication

我们使用此注解来标记 Spring Boot 应用程序的主类:

@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. 自动配置条件(Auto-Configuration Conditions)

通常,当我们编写自定义的自动配置时,希望 Spring 能够根据某些条件来决定是否使用这些配置。我们可以使用本节介绍的注解来实现这一点。

这些注解可以应用于 @Configuration 类或 @Bean 方法上。

在接下来的小节中,我们仅介绍每个条件背后的基本概念。如需更详细的信息,请参阅相关文章。

4.1. @ConditionalOnClass 和 @ConditionalOnMissingClass

使用这些条件注解,Spring 只有在注解参数中指定的类存在(@ConditionalOnClass)或不存在(@ConditionalOnMissingClass)时,才会使用被标记的自动配置 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 仅在特定资源存在时才使用某个定义:

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

4.5. @ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication

使用这些注解,我们可以根据当前应用程序是否为 Web 应用程序来创建条件:

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

4.6. @ConditionalExpression

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

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

注意:上述表达式中的占位符(如 ${usemysql})应确保在配置文件中已定义。

4.7. @Conditional

对于更加复杂的条件判断,我们可以创建一个自定义的条件评估类,并通过 @Conditional 告诉 Spring 使用该条件:

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

5. 结论

在本文中,我们概述了如何微调自动配置过程,并为自定义的自动配置 Bean 提供各种条件控制。