文章目录
- 简介
- @SpringBootApplication
- @EnableAutoConfiguration
- 条件自动配置
- @ConditionalOnClass 和 @ConditionalOnMissingClass
- @ConditionalOnProperty
- @ConditionalOnResource
- @ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication
- @ConditionalExpression
- @Conditional
Spring Boot注解
简介
Spring Boot通过自动配置让我们更加简单的使用Spring。在本文中我们将会介绍org.springframework.boot.autoconfigure 和org.springframework.boot.autoconfigure.condition 里面经常会用到的一些注解。
@SpringBootApplication
首先我们看一下@SpringBootApplication:
1@SpringBootApplication 2public class AnotationApp { 3 public static void main(String[] args) { 4 SpringApplication.run(AnotationApp.class, args); 5 } 6}
@SpringBootApplication被用在Spring Boot应用程序的Main class中,表示整个应用程序是Spring Boot。
@SpringBootApplication实际上是@Configuration, @EnableAutoConfiguration 和 @ComponentScan 的集合。
@EnableAutoConfiguration
@EnableAutoConfiguration 意味着开启了自动配置。这意味着Spring Boot会去在classpath中查找自动配置的beans,并且自动应用他们。
注意, @EnableAutoConfiguration需要和@Configuration配合使用。
1@Configuration 2@EnableAutoConfiguration 3public class VehicleFactoryConfig { 4}
条件自动配置
有时候,我们在自定义自动配置的时候,希望根据某些条件来开启自动配置,Spring Boot 提供了一些有用的注解。
这些注解可以和@Configuration 类 或者 @Bean 方法一起使用。
@ConditionalOnClass 和 @ConditionalOnMissingClass
这两个注解的意思是,如果注解参数中的类存在或者不存在则Spring会去实例化自动配置的bean。
1@Configuration 2@ConditionalOnClass(DataSource.class) 3public class MySQLAutoconfiguration { 4}
@ConditionalOnBean 和 @ConditionalOnMissingBean
这两个和上面的区别在于,这两个是判断是否有实例化的bean存在。
1@Bean 2@ConditionalOnBean(name = "dataSource") 3LocalContainerEntityManagerFactoryBean entityManagerFactory() { 4 // ... 5}
@ConditionalOnProperty
使用这个注解我们可以判断Property的某些属性是不是需要的值:
1@Bean 2@ConditionalOnProperty( 3 name = "usemysql", 4 havingValue = "local" 5) 6DataSource dataSource() { 7 // ... 8}
@ConditionalOnResource
只有当某些resource存在的时候,才会起作用。
1@ConditionalOnResource(resources = "classpath:mysql.properties") 2Properties additionalProperties() { 3 // ... 4}
@ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication
这两个注解通过判断是否web应用程序。
1@Bean 2 @ConditionalOnWebApplication 3 HealthCheckController healthCheckController() { 4 // ... 5 return null; 6 }
@ConditionalExpression
这个注解可以使用SpEL构造更加复杂的表达式:
1@Bean 2@ConditionalOnExpression("${usemysql} && ${mysqlserver == 'local'}") 3DataSource dataSource() { 4 // ... 5}
@Conditional
还有一种更加复杂的应用叫@Conditional,它的参数是一个自定义的condition类。
1@Bean 2 @Conditional(HibernateCondition.class) 3 Properties newAdditionalProperties() { 4 //... 5 return null; 6 } 7 8public class HibernateCondition implements Condition { 9 @Override 10 public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { 11 return false; 12 } 13}
这个类需要实现matches方法。
本文的例子可以参考:https://github.com/ddean2009/learn-springboot2/tree/master/spring-boot-annotations
更多教程请参考 flydean的博客