Spring 中最常用的 5 个注解

Java 中注解的引入改变了 Java 开发人员配置应用的方式。注解在 Java 的 1.5 版本中引入进来,它使开发人员能够在代码中维护配置而不必依赖于外部配置文件。

注解是可以添加到 Java 类、方法、变量、参数或者包中的一种语法元数据。

Spring 框架推荐开发人员通过使用它提供的大量内置注解来配置应用。在这篇文章中,我们重点介绍 Spring Core 框架中最常用的几个注解。

1. @Autowired 注解

这个注解用于声明类中的依赖项。基于这个注解,Spring DI 框架可以注入对应的依赖。@Autowired 可以用在构造函数、属性和 setter 方法上。它是 JSR-330(Java 依赖注入)@Inject 注解的替代方法。

属性注入

下面的代码演示了如何将属性作为依赖项注入:

1
2
3
4
5
6
7
8
import org.springframework.beans.factory.annotation.Autowired;

public class UserController {

@Autowired
private UserRepository userRepository;

}

Setter 方法注入

也可以通过 setter 方法完成依赖注入,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import org.springframework.beans.factory.annotation.Autowired;

public class UserController {

private UserRepository userRepository;

public UserRepository getUserRepository() {
return userRepository;
}

@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}


}

构造函数注入

还可以在构造函数上使用:

1
2
3
4
5
6
7
8
9
10
11
12
import org.springframework.beans.factory.annotation.Autowired;

public class UserController {

private UserRepository userRepository;

@Autowired
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}

}

2. @Bean 注解

这个注解应用在方法上,并生成由 Spring 管理的 bean。Spring 配置类通常包含 bean 声明。通常,应用的 POJO 部分被声明为 Spring 组件,并且 Spring 提供的组件扫描机制会在 Spring IoC 容器中自动创建 bean。但是,当 POJO 的代码不可用并且我们需要创建 Sprint 管理的 bean 时,@bean 注解就会非常有用。

以下代码演示了 @Bean 注解的用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SampleConfiguration {

@Bean
public User user(){
return new User();
}

@Bean(name = "admin", initMethod = "", destroyMethod = "")
public Admin admin(){
return new Admin();
}
}

此外,这个注解还提供给了一些属性用以管理 bean 配置,例如:名称、初始化方法、销毁方法等。

3. @Value 注解

Spring 的 @Value 注解非常有用,可以方便地使用 Spring 表达式语言(Spring Expression Language,SpEL)提供默认值或控制变量的值。

默认值

在下边的示例中,name 变量配置了 @Value 注解。如果实例化 User 类时没有为 name 提供值,就会使用 @Value 配置的默认值 default-user

1
2
3
4
5
6
7
import org.springframework.beans.factory.annotation.Value;

public class User {

@Value("default-user")
private String name;
}

从环境中读取属性

下面的示例演示如何从环境中读取一个值并赋给变量:

1
2
3
4
5
public class User {

@Value("${NAME}")
private String name;
}

使用 Spring 表达式语言

下边的示例演示如何使用 Spring 表达式语言来获取值并赋值给变量。注意这里使用了 # 来替代之前使用的 $

1
2
3
4
5
public class User {

@Value("#{systemProperties['user.name']}")
private String name;
}

4. @Profile 注解

在开发的生命周期中,应用会经历多个环境和阶段。比如,devtestuat(预发布)、industry(生产)等。根据不同的环境和阶段,需要有不同的配置。在这种情况下,@Profile 注解非常方便,它使开发人员可以灵活地控制应该激活的组件。

1
2
3
4
5
6
7
8
@Profile("dev")
public class DevDataSource {
}

@Profile("test")
public class QADataSource {

}

在上边的示例中,我们提供了两个配置,一个用于 dev 环境,另一个用于 test 环境。根据环境类型,我们可以提供不同的配置,Spring 将会确保加载与之对应的配置。

5. @Import 注解

@Import 注解使我们可以将一个或多个组件的配置导入到另一个配置类中。

1
2
3
4
5
6
7
8
9
@Configuration
@Import(SampleConfiguration.class)
public class AnotherConfiguration {

@Bean
public Product product(){
return new Product();
}
}

在上边的配置类中,我们导入了另一个配置类中定义的配置。

总结

本文我们演示了在 Spring 应用开发中使用最频繁的一些注解。尽管有大量的 Spring 注解,但那些注解在大多数 Spring 应用中用到的不多。