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