原文: https://howtodoinjava.com/spring-boot2/spring-boot-annotations/

SpringBoot注解大部分放在org.springframework.boot.autoconfigureorg.springframework.boot.autoconfigure.condition封装中。 让我们了解一些常用的SpringBoot 注解以及在幕后工作的注解。

1. @SpringBootApplication

SpringBoot 主要是关于自动配置。 这种自动配置是通过组件扫描来完成的,即在classspath中找到@Component注解的所有类。 它还涉及扫描@Configuration注解并初始化一些额外的 bean。

@SpringBootApplication注解可一步实现所有功能。 它启用了三个功能:

  1. @EnableAutoConfiguration:启用自动配置机制
  2. @ComponentScan:启用@Component扫描
  3. @SpringBootConfiguration:在上下文中注册额外的 bean

带有@SpringBootApplication注解的 Java 类是 Spring Boot 应用程序的主要类,应用程序从此处开始。

  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. @SpringBootApplication
  4. public class Application {
  5. public static void main(String[] args) {
  6. SpringApplication.run(Application.class, args);
  7. }
  8. }

2. @EnableAutoConfiguration

该注解启用 Spring 应用上下文的自动配置,并根据类路径中预定义类的存在来尝试猜测和配置我们可能需要的 bean。

例如,如果我们在类路径上具有tomcat-embedded.jar,则可能需要TomcatServletWebServerFactory

由于此注解已经通过@SpringBootApplication包含在内,因此在主类上再次添加它不会产生影响。 还建议仅通过@SpringBootApplication将此注解包含一次。

自动配置类是常规的 Spring 配置 bean。 它们使用SpringFactoriesLoader机制定位(针对此类)。 通常,自动配置 bean 是@Conditional bean(最常使用@ConditionalOnClass@ConditionalOnMissingBean注解)。

3. @SpringBootConfiguration

它指示一个类提供 Spring Boot 应用程序配置。 可以用作 Spring 标准@Configuration注解的替代方法,以便可以自动找到配置。

应用程序只能包含一个@SpringBootConfiguration,并且大多数惯用的 Spring Boot 应用程序都将从@SpringBootApplication继承它。

两个注解的主要区别在于@SpringBootConfiguration允许自动定位配置。 这对于单元测试或集成测试特别有用。

4. @ImportAutoConfiguration

它仅导入和应用指定的自动配置类。 @ImportAutoConfiguration@EnableAutoConfiguration之间的区别在于,稍后尝试配置在扫描过程中在类路径中找到的 bean,而@ImportAutoConfiguration仅运行我们在注解中提供的配置类。

当我们不想启用默认自动配置时,应使用@ImportAutoConfiguration

@ImportAutoConfiguration example

  1. @ComponentScan("path.to.your.controllers")
  2. @ImportAutoConfiguration({WebMvcAutoConfiguration.class
  3. ,DispatcherServletAutoConfiguration.class
  4. ,EmbeddedServletContainerAutoConfiguration.class
  5. ,ServerPropertiesAutoConfiguration.class
  6. ,HttpMessageConvertersAutoConfiguration.class})
  7. public class App
  8. {
  9. public static void main(String[] args)
  10. {
  11. SpringApplication.run(App.class, args);
  12. }
  13. }

5. @AutoConfigureBefore@AutoConfigureAfter@AutoConfigureOrder

如果我们的配置需要以特定顺序(在之前之前)应用,则可以使用@AutoConfigureAfter@AutoConfigureBefore注解。

如果我们要订购某些彼此之间不具有直接知识的自动配置,则也可以使用@AutoConfigureOrder。 该注解与常规@Order注解具有相同的语义,但为自动配置类提供了专用顺序。

@AutoConfigureAfter Example

  1. @Configuration
  2. @AutoConfigureAfter(CacheAutoConfiguration.class)
  3. @ConditionalOnBean(CacheManager.class)
  4. @ConditionalOnClass(CacheStatisticsProvider.class)
  5. public class RedissonCacheStatisticsAutoConfiguration
  6. {
  7. @Bean
  8. public RedissonCacheStatisticsProvider redissonCacheStatisticsProvider(){
  9. return new RedissonCacheStatisticsProvider();
  10. }
  11. }

5. 条件注解

所有自动配置类通常都具有一个或多个@Conditional注解。 它仅在条件满足时才允许注册 bean。 以下是一些有用的条件注解。

5.1. @ConditionalOnBean@ConditionalOnMissingBean

这些注解可根据是否存在特定 bean 来包含 bean。

value属性用于通过或by name类型指定 bean。search属性还允许我们限制在搜索 bean 时应考虑的ApplicationContext层次结构。

如果条件不匹配,则在类级别使用这些注解可防止将@Configuration类注册为 Bean。

在下面的示例中,只有在应用程序上下文中尚未定义类型JpaTransactionManager的 bean 时,才会加载 bean JpaTransactionManager

  1. @Bean
  2. @ConditionalOnMissingBean(type = "JpaTransactionManager")
  3. JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory)
  4. {
  5. JpaTransactionManager transactionManager = new JpaTransactionManager();
  6. transactionManager.setEntityManagerFactory(entityManagerFactory);
  7. return transactionManager;
  8. }

5.2. @ConditionalOnClass@ConditionalOnMissingClass

这些注解可根据是否存在特定类来包含配置类。 请注意,注解元数据是通过使用 spring ASM 模块进行解析的,即使在运行时中可能不存在类,您仍然可以在注解中引用该类。

我们还可以使用value属性引用真实的类,或使用name属性通过使用字符串值来指定类名称。

仅当此类在运行时可用并且应用程序上下文中不存在其他具有相同名称的 bean 时,以下配置才会创建EmbeddedAcmeService

  1. @Configuration
  2. @ConditionalOnClass(EmbeddedAcmeService.class)
  3. static class EmbeddedConfiguration
  4. {
  5. @Bean
  6. @ConditionalOnMissingBean
  7. public EmbeddedAcmeService embeddedAcmeService() { ... }
  8. }

5.3. @ConditionalOnNotWebApplication@ConditionalOnWebApplication

这些注解根据应用程序是否为“Web 应用程序”而包含配置。 在 Spring,Web 应用程序是至少满足以下三个要求之一的应用程序:

  1. 使用 SpringWebApplicationContext
  2. 定义session范围
  3. 有一个StandardServletEnvironment

5.4. @ConditionalOnProperty

这个注解允许基于 Spring Environment属性的存在和值包括配置。

例如,如果我们针对不同的环境具有不同的数据源定义,则可以使用此注解。

  1. @Bean
  2. @ConditionalOnProperty(name = "env", havingValue = "local")
  3. DataSource dataSource()
  4. {
  5. // ...
  6. }
  7. @Bean
  8. @ConditionalOnProperty(name = "env", havingValue = "prod")
  9. DataSource dataSource()
  10. {
  11. // ...
  12. }

5.5. @ConditionalOnResource

该注解使配置仅在类路径中存在特定资源时才包括在内。 可以使用常规的 Spring 约定来指定资源。

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

5.6. @ConditionalOnExpression

该注解允许基于 SpEL 表达式的结果包括配置。 当要评估的条件很复杂且应作为一个条件评估时,请使用此注解。

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

5.7. @ConditionalOnCloudPlatform

当指定的云平台处于活动状态时,此注解可包括配置。

  1. @Configuration
  2. @ConditionalOnCloudPlatform(CloudPlatform.CLOUD_FOUNDRY)
  3. public class CloudConfigurationExample
  4. {
  5. @Bean
  6. public MyBean myBean(MyProperties properties)
  7. {
  8. return new MyBean(properties.getParam);
  9. }
  10. }

在评论中向我发送有关SpringBoot 注解的问题。

学习愉快!

参考: Spring Boot Docs