Spring Boot Annotations 注解
1.概述
Spring Boot通过其自动配置功能使Spring更容易配置。
在本教程中,我们将探讨org.springframework.boot.autoconfigure和org.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提供条件。