注入、资源和自动装配注解

6 浏览
0 Comments

注入、资源和自动装配注解

什么是@Inject@Resource@Autowired注释之间的区别?

我们应该何时使用它们?

admin 更改状态以发布 2023年5月20日
0
0 Comments

|------------|---------------|---------------|---------------|-----------------------|
|            | 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具有完全相同的行为。

0
0 Comments

@Inject vs. @Autowire vs. @Resource有什么区别?

@Autowired:Spring所拥有的一个注解(与@Inject和@Resource相反),用于按类型注入资源,即通过注释字段或构造函数的类或接口。如果我们有一个接口或一个子类的几个实现,我们可以使用@Qualifier注释来缩小选择范围以避免歧义。对于备选匹配,bean名称被视为默认限定符值。虽然您可以使用此约定来按名称引用特定的bean,但是@Autowired从根本上讲是关于类型驱动的注入,具有可选的语义限定符。

@Inject:基于JSR-330(Java的依赖注入)的注释识别可注入的构造函数、方法和字段。这个注释几乎可以完全替换Spring的@Autowired注释。因此,您可以选择使用@Inject而不是使用Spring特定的@Autowired注释。@Autowired和@Inject之间的差异之一是@Inject没有必需的字段,因此在我们找不到适合的对象来注入时,它将失败,而@Autowired可以使用required = false,并允许具有可空字段(仅在需要时!)。
@Inject注释的优点是,您可以要求@Inject直接注入Provider引用。Provider接口使得许多事情变得可能,例如惰性注入bean引用和bean的多个实例的注入。
如果我们有一个接口或一个子类的几个实现,我们可以使用@Named注释来缩小选择范围以避免歧义。@Named注释的作用类似于Spring的@Qualifier。

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

0