Spring Boot「04」Annotations 01

106 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第04天,点击查看活动详情

简单地讲,Spring Boot 是 Spring 框架的扩展,它消除了使用 Spring 框架开发应用所需要的、大量的样板配置代码。 Spring Boot 中最显著的就是其所谓的“自动化配置”功能。 Spring Boot 项目追求的是快速、高效地开发,及完备的生态链。 Spring Boot 的特性有:

  • 通过各种 starter 依赖,简化构建过程和应用配置;
  • 通过内置 Server(tomcat/jetty)来避免部署时的复杂性;
  • 通过 auto configure 尽可能地自动配置 Spring 框架

01-Spring Boot 中的常用注解之一:@SpringBootApplication

@SpringBootApplication
public class SpringBootAnnotations {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootAnnotations.class, args);
    }
}

注解@SpringBootApplication等价于:@Configuration + @EnableAutoConfiguration + @ComponentScan

@EnableAutoConfiguration

注解的主要作用是开启自动化配置。 开启以后,Spring Boot 会在 classpath 中查找所有所有的 auto-configuration beans,并应用它们。 该标签必须与@Configuration搭配使用。

02-条件化自动配置

本节涉及的注解,可以与@Configuration@Bean一起使用。

  1. @ConditionalOnClass@ConditionalOnMissingClass,仅当传入注解中的参数在 classpath 中存在(或不存在)时,@Configuration@Bean才生效。
  2. @ConditionalOnBean@ConditionalOnMissingBean,仅当传入注解中的 bean 存在(或不存在)时,@Configuration@Bean才生效
  3. @ConditionalOnProperty,仅当某个 property 的值为特定值时,@Configuration@Bean才生效
    @Bean
    @ConditionalOnProperty(
        name = "usemysql", 
        havingValue = "local"
    )
    DataSource dataSource() {
        // ...
    }
    
  4. @ConditionalOnResource,仅当某个资源(例如 classpath:application.properties)存在时,@Configuration@Bean才生效
    @ConditionalOnResource(resources = "classpath:mysql.properties")
    Properties additionalProperties() {
        // ...
    }
    
  5. @ConditionalOnWebApplication@ConditionalOnNotWebApplication,仅当应用是(或者不是)web 应用时,@Configuration@Bean才生效
    @ConditionalOnWebApplication
    HealthCheckController healthCheckController() {
        // ...
    }
    
  6. @ConditionalExpression,仅当作为注解参数的 SpEL 表达式值为 true 时,@Configuration@Bean才生效
    @Bean
    @ConditionalOnExpression("${usemysql} && ${mysqlserver == 'local'}")
    DataSource dataSource() {
        // ...
    }
    
  7. @Conditional,仅当作为参数指定的类(实现了Condition接口)返回值为 true 时,@Configuration@Bean才生效
    @Conditional(HibernateCondition.class)
    Properties additionalProperties() {
        //...
    }
    public class HibernateCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return true; }
    }