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 应用中用到的不多。