說明:
@Resource和@Autowired都是做bean的注入時使用缩功,@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要導(dǎo)入,但是Spring支持該注解的注入。
相同點:
兩者都可以寫在字段和setter方法上猾编。兩者如果都寫在字段上,那么就不需要再寫setter方法升敲。
不同點:
(1)@Autowired
@Autowired為Spring提供的注解答倡,需要導(dǎo)入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
@Autowired注解是按照類型(byType)裝配依賴對象驴党,默認情況下它要求依賴對象必須存在瘪撇,如果允許null值,可以設(shè)置它的required屬性為false。如果我們想使用按照名稱(byName)來裝配倔既,可以結(jié)合@Qualifier注解一起使用恕曲。
(2)@Resource
@Resource默認按照ByName自動注入,由J2EE提供渤涌,需要導(dǎo)入包javax.annotation.Resource佩谣。@Resource有兩個重要的屬性:name和type,而Spring將@Resource注解的name屬性解析為bean的名字实蓬,而type屬性則解析為bean的類型茸俭。
所以,如果使用name屬性瞳秽,則使用byName的自動注入策略瓣履,而使用type屬性時則使用byType自動注入策略。如果既不制定name也不制定type屬性练俐,這時將通過反射機制使用byName自動注入策略袖迎。
注:最好是將@Resource放在setter方法上,因為這樣更符合面向?qū)ο蟮乃枷胂倭溃ㄟ^set燕锥、get去操作屬性,而不是直接去操作屬性悯蝉。
@Resource裝配順序:
①如果同時指定了name和type归形,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常鼻由。
②如果指定了name暇榴,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常蕉世。
③如果指定了type蔼紧,則從上下文中找到類似匹配的唯一bean進行裝配,找不到或是找到多個狠轻,都會拋出異常奸例。
④如果既沒有指定name,又沒有指定type向楼,則自動按照byName方式進行裝配查吊;如果沒有匹配,則回退為一個原始類型進行匹配湖蜕,如果匹配則自動裝配逻卖。
@Resource的作用相當(dāng)于@Autowired,只不過@Autowired按照byType自動注入昭抒。