Search code examples
javaspringdependency-injectionannotationsautowired

@Resource vs @Autowired


Which annotation, @Resource (jsr250) or @Autowired (Spring-specific) should I use in DI?

I have successfully used both in the past, @Resource(name="blah") and @Autowired @Qualifier("blah")

My instinct is to stick with the @Resource tag since it's been ratified by the jsr people.
Anyone has strong thoughts on this?


Solution

  • In spring pre-3.0 it doesn't matter which one.

    In spring 3.0 there's support for the standard (JSR-330) annotation @javax.inject.Inject - use it, with a combination of @Qualifier. Note that spring now also supports the @javax.inject.Qualifier meta-annotation:

    @Qualifier
    @Retention(RUNTIME)
    public @interface YourQualifier {}
    

    So you can have

    <bean class="com.pkg.SomeBean">
       <qualifier type="YourQualifier"/>
    </bean>
    

    or

    @YourQualifier
    @Component
    public class SomeBean implements Foo { .. }
    

    And then:

    @Inject @YourQualifier private Foo foo;
    

    This makes less use of String-names, which can be misspelled and are harder to maintain.


    As for the original question: both, without specifying any attributes of the annotation, perform injection by type. The difference is:

    • @Resource allows you to specify a name of the injected bean
    • @Autowired allows you to mark it as non-mandatory.