我应该在DI中使用哪个注释,即@Resource (jsr250)还是@Autowired (Spring特定的)?
我过去曾成功地使用过@Resource(name="blah")和@Autowired @Qualifier("blah")。
我的直觉是坚持使用@Resource标签,因为它已经得到了jsr的批准。
有人对此有强烈的想法吗?
发布于 2010-11-04 09:21:16
在春季的3.0前,哪一个并不重要。
在Spring3.0中,对标准(JSR-330)注释@javax.inject.Inject的支持--使用它,并结合使用@Qualifier。请注意,spring现在也支持@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允许您将其标记为非强制性的。发布于 2012-06-06 14:54:38
@Autowired (或@Inject)和@Resource都工作得同样好。但是在概念上有区别或者在意义上有区别。
@Resource的意思是给我一个名为的已知资源。该名称是从带注释的setter或字段的名称中提取的,或者从名称参数中提取。@Inject或@Autowired试图按类型在中连接合适的其他组件。基本上,这是两个截然不同的概念。不幸的是,@Resource的Spring实现有一个内置的退路,当按名解析失败时,它就会起作用。在本例中,它按类型返回到@Autowired-kind解析。虽然这种退步很方便,但IMHO会造成许多混乱,因为人们不知道概念上的差异,而且倾向于使用@Resource进行基于类型的自动装配。
发布于 2010-11-04 03:39:51
主要的区别是,@Autowired是一个spring注释。然而,正如您自己指出的,@Resource是由JSR-250指定的。因此,后者是Java的一部分,而前者是Spring特定的。
因此,从某种意义上说,你的建议是正确的。我发现人们在使用@Autowired时使用@Qualifier,因为它更强大。从某个框架转移到另一个框架被认为是非常不可能的,如果不是神话的话,尤其是在Spring的情况下。
https://stackoverflow.com/questions/4093504
复制相似问题