Attila Fejér 2018-06-01
1. 概述
Spring Boot 通过其自动配置(auto-configuration)特性,使 Spring 的配置变得更加简单。
在本篇快速教程中,我们将探讨来自 org.springframework.boot.autoconfigure 和 org.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 提供各种条件控制。