# Spring Boot 注解

> 原文： [https://howtodoinjava.com/spring-boot2/spring-boot-annotations/](https://howtodoinjava.com/spring-boot2/spring-boot-annotations/)

[SpringBoot](https://howtodoinjava.com/spring-boot-tutorials/)注解大部分放在`org.springframework.boot.autoconfigure`和`org.springframework.boot.autoconfigure.condition`封装中。 让我们了解一些常用的**SpringBoot 注解**以及在幕后工作的注解。

## 1\. `@SpringBootApplication`

SpringBoot 主要是关于自动配置。 这种自动配置是通过**组件扫描**来完成的，即在`classspath`中找到[`@Component`](https://howtodoinjava.com/spring-core/how-to-use-spring-component-repository-service-and-controller-annotations/)注解的所有类。 它还涉及扫描`@Configuration`注解并初始化一些额外的 bean。

[`@SpringBootApplication`](https://howtodoinjava.com/spring-boot/springbootapplication-auto-configuration/)注解可一步实现所有功能。 它启用了三个功能：

1.  `@EnableAutoConfiguration`：启用自动配置机制
2.  [`@ComponentScan`](https://howtodoinjava.com/spring-mvc/spring-mvc-difference-between-contextannotation-config-vs-contextcomponent-scan/)：启用`@Component`扫描
3.  `@SpringBootConfiguration`：在上下文中注册额外的 bean

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

```java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication 
public class Application {

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

}

```

## 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`

```java
@ComponentScan("path.to.your.controllers")
@ImportAutoConfiguration({WebMvcAutoConfiguration.class
    ,DispatcherServletAutoConfiguration.class
    ,EmbeddedServletContainerAutoConfiguration.class
    ,ServerPropertiesAutoConfiguration.class
    ,HttpMessageConvertersAutoConfiguration.class})
public class App 
{
	public static void main(String[] args) 
	{
		SpringApplication.run(App.class, args);
	}
}

```

## 5\. `@AutoConfigureBefore`，`@AutoConfigureAfter`，`@AutoConfigureOrder`

如果我们的配置需要以特定顺序（在之前之前）应用，则可以使用`@AutoConfigureAfter`或`@AutoConfigureBefore`注解。

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

`@AutoConfigureAfter Example`

```java
@Configuration
@AutoConfigureAfter(CacheAutoConfiguration.class)
@ConditionalOnBean(CacheManager.class)
@ConditionalOnClass(CacheStatisticsProvider.class)
public class RedissonCacheStatisticsAutoConfiguration 
{
	@Bean
	public RedissonCacheStatisticsProvider redissonCacheStatisticsProvider(){
		return new RedissonCacheStatisticsProvider();
	}
}

```

## 5\. 条件注解

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

#### 5.1. `@ConditionalOnBean`和`@ConditionalOnMissingBean`

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

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

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

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

```java
@Bean
@ConditionalOnMissingBean(type = "JpaTransactionManager")
JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) 
{
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory);
    return transactionManager;
}

```

#### 5.2. `@ConditionalOnClass`和`@ConditionalOnMissingClass`

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

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

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

```java
@Configuration
@ConditionalOnClass(EmbeddedAcmeService.class)
static class EmbeddedConfiguration 
{

	@Bean
	@ConditionalOnMissingBean
	public EmbeddedAcmeService embeddedAcmeService() { ... }

}

```

#### 5.3. `@ConditionalOnNotWebApplication`和`@ConditionalOnWebApplication`

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

1.  使用 Spring`WebApplicationContext`
2.  定义`session`范围
3.  有一个`StandardServletEnvironment`

#### 5.4. `@ConditionalOnProperty`

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

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

```java
@Bean
@ConditionalOnProperty(name = "env", havingValue = "local")
DataSource dataSource() 
{
    // ...
}

@Bean
@ConditionalOnProperty(name = "env", havingValue = "prod")
DataSource dataSource() 
{
    // ...
}

```

#### 5.5. `@ConditionalOnResource`

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

```java
@ConditionalOnResource(resources = "classpath:vendor.properties")
Properties additionalProperties() 
{
    // ...
}

```

#### 5.6. `@ConditionalOnExpression`

该注解允许基于[ SpEL 表达式](https://docs.spring.io/spring/docs/5.1.8.RELEASE/spring-framework-reference/core.html#expressions)的结果包括配置。 当要评估的条件很复杂且应作为一个条件评估时，请使用此注解。

```java
@Bean
@ConditionalOnExpression("${env} && ${havingValue == 'local'}")
DataSource dataSource() 
{
    // ...
}

```

#### 5.7. `@ConditionalOnCloudPlatform`

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

```java
@Configuration
@ConditionalOnCloudPlatform(CloudPlatform.CLOUD_FOUNDRY)
public class CloudConfigurationExample 
{
  @Bean
  public MyBean myBean(MyProperties properties) 
  {
    return new MyBean(properties.getParam);
  }
}

```

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

学习愉快！

参考： [Spring Boot Docs](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html)