Java 中注解的引入改变了 Java 开发人员配置应用的方式。注解在 Java 的 1.5 版本中引入进来,它使开发人员能够在代码中维护配置而不必依赖于外部配置文件。
注解是可以添加到 Java 类、方法、变量、参数或者包中的一种语法元数据。
Spring 框架推荐开发人员通过使用它提供的大量内置注解来配置应用。在这篇文章中,我们重点介绍 Spring Core 框架中最常用的几个注解。
这个注解用于声明类中的依赖项。基于这个注解,Spring DI 框架可以注入对应的依赖。 @Autowired 可以用在构造函数、属性和 setter 方法上。它是 JSR-330(Java 依赖注入) @Inject 注解的替代方法。
下面的代码演示了如何将属性作为依赖项注入:
import org.springframework.beans.factory.annotation.Autowired;
public class UserController {
@Autowired
private UserRepository userRepository;
}
也可以通过 setter 方法完成依赖注入,如下所示:
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;
}
}
还可以在构造函数上使用:
import org.springframework.beans.factory.annotation.Autowired;
public class UserController {
private UserRepository userRepository;
@Autowired
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
这个注解应用在方法上,并生成由 Spring 管理的 bean。Spring 配置类通常包含 bean 声明。通常,应用的 POJO 部分被声明为 Spring 组件,并且 Spring 提供的组件扫描机制会在 Spring IoC 容器中自动创建 bean 。但是,当 POJO 的代码不可用并且我们需要创建 Sprint 管理的 bean 时, @bean 注解就会非常有用。
以下代码演示了 @Bean 注解的用法:
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 配置,例如:名称、初始化方法、销毁方法等。
Spring 的 @Value 注解非常有用,可以方便地使用 Spring 表达式语言(Spring Expression Language,SpEL)提供默认值或控制变量的值。
在下边的示例中, name 变量配置了 @Value 注解。如果实例化 User 类时没有为 name 提供值,就会使用 @Value 配置的默认值 default-user 。
import org.springframework.beans.factory.annotation.Value;
public class User {
@Value("default-user")
private String name;
}
下面的示例演示如何从环境中读取一个值并赋给变量:
public class User {
@Value("${NAME}")
private String name;
}
下边的示例演示如何使用 Spring 表达式语言来获取值并赋值给变量。注意这里使用了 # 来替代之前使用的 $ 。
public class User {
@Value("#{systemProperties['user.name']}")
private String name;
}
在开发的生命周期中,应用会经历多个环境和阶段。比如, dev 、 test 、 uat (预发布)、 industry (生产)等。根据不同的环境和阶段,需要有不同的配置。在这种情况下, @Profile 注解非常方便,它使开发人员可以灵活地控制应该激活的组件。
@Profile("dev")
public class DevDataSource {
}
@Profile("test")
public class QADataSource {
}
在上边的示例中,我们提供了两个配置,一个用于 dev 环境,另一个用于 test 环境。根据环境类型,我们可以提供不同的配置,Spring 将会确保加载与之对应的配置。
@Import 注解使我们可以将一个或多个组件的配置导入到另一个配置类中。
@Configuration
@Import(SampleConfiguration.class)
public class AnotherConfiguration {
@Bean
public Product product(){
return new Product();
}
}
在上边的配置类中,我们导入了另一个配置类中定义的配置。
本文我们演示了在 Spring 应用开发中使用最频繁的一些注解。尽管有大量的 Spring 注解,但那些注解在大多数 Spring 应用中用到的不多。