1.概述

Spring Boot通过其自动配置功能使Spring更容易配置。

在本教程中,我们将探讨org.springframework.boot.autoconfigureorg.springframework.boot.autoconfigure.condition包中的注释。

2. @SpringBootApplication

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



 



@SpringBootApplication封装@Configuration@EnableAutoConfiguration@ComponentScan注解与他们的默认属性。

springboot程序默认会扫描主类所在包及其子包,所以一般主类放在最外层



1 @SpringBootApplication
2 class VehicleFactoryApplication {
3  
4     public static void main(String[] args) {
5         SpringApplication.run(VehicleFactoryApplication.class, args);
6     }
7 }



3. @EnableAutoConfiguration

@EnableAutoConfiguration,正如其名称所示,支持自动配置。这意味着Spring Boot在其类路径中查找自动配置bean并自动应用它们。(如根据配置文件,classpath下jar包动态决定要自动注入哪些bean)

注意,我们必须在@Configuration中使用此注释:



1 @Configuration
2 @EnableAutoConfiguration
3 class VehicleFactoryConfig {}



 



4.自动配置条件

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

我们可以在本节中将注释放在@Configuration类或@Bean方法上。

在接下来的部分中,我们将仅介绍每种情况背后的基本概念。

4.1.@ConditionalOnClass@ConditionalOnMissingClass

如果注释参数中的类在classpath中存在/不存在,Spring依据此结果决定是否启动这个configuration(即是否实例化这个bean)



1 @Configuration
2 @ConditionalOnClass(DataSource.class)
3 class MySQLAutoconfiguration {
4     //...
5 }



4.2.@ConditionalOnBean@ConditionalOnMissingBean

当我们想要根据特定bean的存在与否来定义条件时,我们可以使用这些注释:(如下例,只有依赖的bean存在时,自身的bean才会被实例化)



1 @Bean
2 @ConditionalOnBean(name = "dataSource")
3 LocalContainerEntityManagerFactoryBean entityManagerFactory() {
4     // ...
5 }



4.3.@ConditionalOnProperty

使用此注释,我们可以为属性值创建条件:(判断是否存在一个属性usemysql,且其值为local)



1 @Bean
2 @ConditionalOnProperty(
3     name = "usemysql", 
4     havingValue = "local"
5 )
6 DataSource dataSource() {
7     // ...
8 }



4.4.@ConditionalOnResource

我们可以让Spring仅在存在特定资源时使用定义:(只有mysql.properties文件存在时才满足条件)



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



4.5.@ConditionalOnWebApplication@ConditionalOnNotWebApplication

通过这些注释,我们可以根据当前应用程序是否是Web应用程序创建条件:(应用程序是否是web程序有springboot自己判断,其是根据servlet相关类判断的)



1 @ConditionalOnWebApplication
2 HealthCheckController healthCheckController() {
3     // ...
4 }



4.6.@ConditionalExpression

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

spel表达式语法 ${} ,  这里的条件就是环境变量(配置信息)中usemysql=true,mysqlserver == local



1 @Bean
2 @ConditionalOnExpression("${usemysql} && ${mysqlserver == 'local'}")
3 DataSource dataSource() {
4     // ...
5 }



4.7.@Conditional

对于更复杂的条件,我们可以创建一个评估自定义条件的类。我们告诉Spring使用@Conditional这个自定义条件:

(HibernateCondition.java类是需要自己创建的,需要实现接口Condition,重写方法matches,返回true or false。 返回true则条件成立)



1 @Conditional(HibernateCondition.class)
2 Properties additionalProperties() {
3     //...
4 }



5.结论

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