# Spring 注解

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

了解最广泛使用的 Spring 注解。 在本教程中，我们将简要介绍 spring 核心提供的重要注解，这些注解用于定义 bean 和创建复杂的应用程序上下文配置。

## 1\. Bean 注解

给定的注解列表用于在 Spring 中定义 bean 并在应用程序上下文中控制其注册首选项。

### `@Bean`

方法级别的注解，用于声明 Spring bean。 当配置执行带注解的方法时，它将返回值注册为[`BeanFactory`](https://howtodoinjava.com/spring-core/different-spring-ioc-containers/)中的 Bean。默认情况下，bean 名称将与方法名称相同。 要自定义 Bean 名称，请使用其`name`或`value`属性。

```java
@Bean
EmployeeService employeeService() 
{
    return new EmployeeServiceImpl();
}

```


### `@Component`

指示带注解的类是“组件”，并且在使用[基于注解的配置](https://howtodoinjava.com/spring5/core/spring-bean-java-config/)和类路径扫描时将被自动检测。要使用此注解，请将其应用于类，如下所示：

```java
@Component
public class EmployeeDAOImpl 
		implements EmployeeDAO {
    ...
}

```


### [`@Repository`](https://howtodoinjava.com/spring-boot/repository-annotation/)

`@Component`注解的特化。 除了将带注解的 DAO 类导入 DI 容器之外，它还使未经检查的异常（从 DAO 方法抛出）有资格转换为 Spring `DataAccessException`。

```java
@Repository
public class EmployeeDAOImpl 
		implements EmployeeDAO
{
    //...
}

```


### `@Service`

`@Component`注解的特化。 它表明一个类是“业务服务门面”或类似的名称。

```java
@Service ("employeeManager")
public class EmployeeManagerImpl 
		implements EmployeeManager
{
    @Autowired
    EmployeeDAO dao;

    ...
}

```


### `@Controller`

专门用于注解控制器（例如 Web 控制器）的`@Component`。 它与基于`RequestMapping`注解的处理器方法结合使用。

```java
@Controller ("employeeController")
public class EmployeeController 
{
	...
}

```


### `@Qualifier`

在自动装配过程中，如果容器中有多个同类型的 bean，那么容器将抛出运行时异常。 为了解决这个问题，我们必须使用此注解，专门告诉 spring 必须注入哪个 bean。在给定的示例中，如果有两个类型为存储库的 bean，则在运行时，将注入名称为`fsRepository`的 bean。

```java
public class EmployeeService {

    @Autowired
    @Qualifier("fsRepository")
    private Repository repository;
}

```


### `@Autowired`

将构造函数，字段，setter 方法或配置方法标记为通过依赖项注入自动装配。 我们可以使用`required`属性标记注解的依赖项是否是必需的（强制填充）。 默认情况下，其值为`true`。

```java
public class EmployeeService {

    @Autowired
    private EmployeeDao dao;
}

```


### [`@Required`](https://howtodoinjava.com/spring-core/spring-required-annotation-and-requiredannotationbeanpostprocessor-example/)

缺省的 bean 自动装配仅检查是否已设置依赖项。 它不检查分配的值是否为`null`。 使用`@Required`，我们可以检查设置的值是否为非空值。 现在已不推荐使用。

### `@Value`

适用于字段或方法/构造函数参数级别，并指示受影响参数的默认值表达式。

```java
public class SomeService {

    @Value("${ENV}")
    private String environment;
}

```


### `@Lazy`

指示是否要延迟初始化 bean。 默认情况下，在 Spring DI 中，将进行立即初始化。当在任何 bean 上应用该 bean 时，只有在另一个 bean 引用或从封装的`BeanFactory`中显式检索到该 bean 时，才会初始化该 bean。

```java
public class SomeService {

    @Autowired
    @Lazy
    private RemoteService remoting;
}

```


### `@DependsOn`

在组件扫描期间，它用于指定当前 bean 所依赖的 bean。 保证指定的 bean 由容器在该 bean 之前创建。

```java
public class SomeService {

    @Autowired
    @DependsOn ("pingService")
    private RemoteService remoting;
}

```


### `@Lookup`

表示一种方法为“查找”方法。 最好用于将原型作用域的 bean 注入到单例 bean 中。

```java
@Component
@Scope("prototype")
public class AppNotification {
    //prototype-scoped bean
}

@Component
public class NotificationService {

    @Lookup
    public AppNotification getNotification() {
        //return new AppNotification();
    }
}

```


### `@Primary`

指示当多个候选者有资格自动装配单值依赖项时，应优先考虑 Bean。当不使用`@Primary`时，我们可能需要提供`@Qualifier`注解以正确注入 bean。在给定的示例中，当自动装配`FooRepository`时，将注入`HibernateFooRepository`的实例 – 直到使用`@Qualifier`注解。

```java
@Component
public class JdbcFooRepository 
	extends FooRepository {
}

@Primary
@Component
public class HibernateFooRepository 
	extends FooRepository {
}

```


### `@Scope`

指示用于带注解类型的实例的范围的名称。 在 Spring 5 中，bean 可以属于六个范围之一，即单例，原型，请求，会话，应用程序和 websocket。 |

## 2\. 上下文配置注解

这些注解有助于将不同的 Bean 绑定在一起以形成运行时应用程序上下文。

### `@ComponentScan`

`@ComponentScan`与`@Configuration`一起用于启用和配置组件扫描。 默认情况下，如果不指定路径，它将扫描当前程序包及其所有子程序包中的组件。使用组件扫描，spring 可以自动扫描所有带有[原型注解](https://howtodoinjava.com/spring-core/stereotype-annotations/)`@Component`，`@Controller`，`@Service`和`@Repository`并使用`BeanFactory`对其进行配置。

```java
@Configuration
@ComponentScan(basePackages = {com.howtodoinjava.data.jpa})
public class JpaConfig {

}

```

### [`@Configuration`](https://howtodoinjava.com/spring-core/spring-configuration-annotation/)

指示一个类声明一个或多个`@Bean`方法，并且与`@ComponentScan`一起使用时，容器可以对其进行处理以生成 bean 定义。

```java
@Configuration
public class AppConfig {

	@Bean
	public AppUtils appUtils()
	{
		return new AppUnits();
	}
}

```

### `@Profile`

指示当一个或多个指定的配置文件处于活动状态时，组件可以进行 Bean 注册。 配置文件是 Bean 的命名逻辑分组，例如开发，生产等。

```java
@Bean
@Profile("dev")
public AppUtils appUtils()
{
	return new DevAppUnits();
}

@Bean
@Profile("prod")
public AppUtils appUtils()
{
	return new ProdAppUnits();
}

```

### `@Import`

指示要导入的一个或多个组件类，通常是`@Configuration`类。导入的`@Configuration`类中声明的`@Bean`定义应使用`@Autowired`注入进行访问。

```java
@Configuration
@Import({ JpaConfig.class, SchedulerConfig.class })
public class AppConfig {

}

```

### `@ImportResource`

指示一个或多个包含要导入的 bean 定义的资源。 它用于 XML bean 定义，就像`@Import`用于使用`@Bean`的 Java 配置一样。

```java
@Configuration  
@ImportResource( { "spring-context.xml" } )  
public class ConfigClass { 

}

```


请把关于上述 Spring 注解列表或解释的问题与我联系。

学习愉快！

参考：

[上下文注解包](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/package-summary.html)
[构造型注解包](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/package-summary.html)