一尘不染

@Inject和@Resource以及@Autowired注释有什么区别?

spring

@Inject和@Resource以及@Autowired注释有什么区别?
我们什么时候应该使用它们?


阅读 447

收藏
2020-04-13

共2个答案

一尘不染

和注释@Inject和有什么区别?@Resource@Autowired

我们什么时候应该使用它们?@Inject与@Autowire与@Resource之间的区别?

@Autowired:spring专有注释(与@Inject和@Resource相反),按类型(即,通过带注释的字段或承包商的接口的类)注入资源。如果接口或子类的实现很少,我们可以使用@Qualifier注释来缩小选择范围,以免产生歧义。对于后备匹配,bean名称被视为默认的限定符值。尽管你可以使用此约定按名称引用特定的bean,但@Autowired基本上是关于带有可选语义限定符的类型驱动的注入。

@注入:基于JSR-330(Java依赖注入)的注释标识可注入的构造函数,方法和字段。该注释几乎完全替代了Spring的@Autowired注释。因此,你可以选择使用@Inject,而不是使用特定于Spring的@Autowired注释。@Autowired和@Inject之间的区别之一是@Inject没有必填字段,因此如果我们未能找到合适的对象来注入它,则@Autowired可以使用required = false并允许空字段(仅如果需要!)。@Inject批注的优点是你可以要求@Inject注入提供程序,而不是直接注入引用。Provider接口除了其他功能外,还可以延迟注入bean引用和注入bean的多个实例。如果接口或子类的实现很少,我们可以使用@Named注释缩小选择范围,以免产生歧义。@Named注释的工作原理与Spring的@Qualifier相似

@Resource:基于JSR-250的注释。@Resource与@Autowired和@Inject非常相似,但是主要区别是执行路径可用于查找需要注入的bean。@Resource将首先按名称缩小搜索范围,然后按类型缩小搜索范围,最后按限定符缩小搜索范围(如果按名称找到匹配项则忽略)。@Autowired和@Inject将首先按类型,然后按限定符,最后按名称缩小搜索范围。

2020-04-13
一尘不染

|------------|---------------|---------------|---------------|-----------------------|
|            | Setter/Field  | Constructor   | Applicable to | Matching order        |
|            | injection     | injection     | type          |                       |
|------------|---------------|---------------|---------------|-----------------------|
| @Autowired |       X       |       X       |               | Type, Qualifier, Name |
|------------|---------------|---------------|---------------|-----------------------|
| @Inject    |       X       |       X       |               | Type, Qualifier, Name |
|------------|---------------|---------------|---------------|-----------------------|
| @Resource  |       X       |               |       X       | Name, Type, Qualifier |
|------------|---------------|---------------|---------------|-----------------------|

因此在Spring依赖注入中@Inject@Autowired它们具有完全相同的行为。

2020-04-13