Java依赖注入相关注解简述
Java开发中常用的依赖注入相关的注解主要包含有以下这些(已注明原始定义位置):
JSR-250标准注解
- @Resource(Spring 支持)
- @PostConstruct、@PreDestroy(Spring 支持)
JSR-330 (javax.inject)
- @Inject(Spring 支持)
- @Qualifer(Spring 支持)
- @Named(Spring 支持)
- @Scope, @Singleton(Spring 支持)
Spring Framework
- @Autowired
- @Required
- @Qualifier
- @Component、@Service、@Controller、@Repository
注解@Resource的作用相当于Spring中的@Autowired,区别在于@Autowired按byType自动注入,而@Resource默认按 byName自动注入。
Spring中的@Autowired可以使用@Inject代替,Maven依赖如下:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
@Resource与@Autowired、@Inject的详细区别:
-- @Autowired、@Inject 注解
默认autowired by type,可以通过@Qualifier 显式指定 autowired by qualifier name(集合类时有些特殊)。如果 autowired by type 失败(找不到或者找到多个实现),则退化为autowired by field name。
-- @Resource注解
默认 autowired by field name,如果 autowired by field name失败,会退化为 autowired by type,可以 通过@Qualifier 显式指定 autowired by qualifier name,如果 autowired by qualifier name失败,会退化为 autowired by field name。但是这时候如果 autowired by field name失败,就不会再退化为autowired by type了。
@Required注解
适用于bean属性的setter方法。
@Component、@Service、@Controller、@Repository
用于声明bean组件,其中@Component是其余几个注解的原型。
@Named
即可用作类似@Component,也可以用作类似@Qualifier注解的作用。
当使用标准注释时,重要的是要知道一些重要的特性是不可用的,具体情况见下表:Spring Framework 注解 vs JSR-330标准注解(来源:-- Spring Framework 5.06官方文档)。
(-- Spring Framework 5.06)