@Resource与@Autowired
2022-08-31 04:35:40
我应该在DI中使用哪个注释,@Resource(jsr250)或@Autowired(特定于弹簧)?
我过去曾成功地使用过这两种用法,并且@Resource(name="blah")
@Autowired @Qualifier("blah")
我的本能是坚持使用这个标签,因为它已经得到了jsr人的批准。
有人对此有强烈的想法吗?@Resource
我应该在DI中使用哪个注释,@Resource(jsr250)或@Autowired(特定于弹簧)?
我过去曾成功地使用过这两种用法,并且@Resource(name="blah")
@Autowired @Qualifier("blah")
我的本能是坚持使用这个标签,因为它已经得到了jsr人的批准。
有人对此有强烈的想法吗?@Resource
两者(或)和工作同样好。但是在概念上存在差异或含义上的差异@Autowired
@Inject
@Resource
@Resource
意味着按名称为我获取已知资源。该名称是从带注释的 setter 或字段的名称中提取的,或者取自 name-Parameter。@Inject
或尝试按类型连接合适的其他组件。@Autowired
所以,基本上这是两个完全不同的概念。不幸的是,Spring-Implementation 有一个内置的回退,当按名称解析失败时,它会启动。在这种情况下,它回退到 -kind 按类型解析。虽然这种回退很方便,但恕我直言,它引起了很多混乱,因为人们没有意识到概念上的差异,并且倾向于用于基于类型的自动布线。@Resource
@Autowired
@Resource
在3.0之前的春天,哪一个并不重要。
在春季3.0中,支持标准(JSR-330)注释 - 使用它,并结合.请注意,spring 现在还支持元注释:@javax.inject.Inject
@Qualifier
@javax.inject.Qualifier
@Qualifier
@Retention(RUNTIME)
public @interface YourQualifier {}
所以你可以有
<bean class="com.pkg.SomeBean">
<qualifier type="YourQualifier"/>
</bean>
或
@YourQualifier
@Component
public class SomeBean implements Foo { .. }
然后:
@Inject @YourQualifier private Foo foo;
这样可以减少字符串名称的使用,字符串名称可能会拼写错误并且更难维护。
至于原始问题:两者,在不指定注释的任何属性的情况下,按类型执行注入。不同之处在于:
@Resource
允许您指定注入的 Bean 的名称@Autowired
允许您将其标记为非强制性。