以下摘抄自
https://www.cnblogs.com/xrq730/p/5313412.html
五月的倉頡
1、@Resource后面沒有任何內容,默認通過name屬性去匹配bean,找不到再按type去匹配
2、指定了name或者type則根據指定的類型去匹配bean
3、指定了name和type則根據指定的name和type去匹配bean,任何一個不匹配都將報錯
然后,區分一下@Autowired和@Resource兩個注解的區別:
1、@Autowired默認按照byType方式進行bean匹配,@Resource默認按照byName方式進行bean匹配
2、@Autowired是Spring的注解,@Resource是J2EE的注解,這個看一下導入注解的時候這兩個注解的包名就一清二楚了
Spring屬於第三方的,J2EE是Java自己的東西,因此,建議使用@Resource注解,以減少代碼和Spring之間的耦合。
建議查看:作者 leiOOlei的博文https://www.cnblogs.com/leiOOlei/p/3713779.html
個人見解:
1、@Autowired和@Resource都是基於@service、@controller、@repository以及xml配置中<bean/>
2、@Autowired和@Resource匹配的內容取決於@service()括號內的內容或 spring的xml配置里 <bean id="benz" class="com.xrq.annotation.Benz" /> 的id(xml配置優先)
3、如果使用@Resource,請最好這么寫@Resource(name="BWM"),因為他是默認按name匹配的,不填寫就按type匹配
4、如果使用@Autowired,請最好不要加@Qualifier("BWM"),因為他是默認按type匹配的,填寫就按name匹配
5、其實@Autowired + @Qualifier("BWM") == @Resource(name="BWM"),@Autowired ==@Resource()或@Resource,用哪個都可以,
6、最好不要這么寫 @Resource()+ @Qualifier("BWM") ,雖然也可以,但是感覺不倫不類,前者屬於j2EE,后者屬於spring
7、當 一個接口有兩個以上實現類的時候才會用到@Autowired + @Qualifier("BWM") 或 @Resource(name="BWM"),這時,
如果使用的是xml,則不用擔心,因為你一定會寫id;
如果使用的是@Service(),請注意:最好在括號內寫上name,和@Autowired +@Qualifier("BWM")或Resource(name="BWM")成對出現,增強可讀性,避免出錯,
因為有一種特殊情況會使你出錯,spring@Service生成bean的命名規則:當類的名字是以兩個或以上連續的大寫字母開頭的話,bean的名字會與類名保持一致,首字母不小寫
8、當一個接口只有一個實現類,@Autowired和@Resource沒有區別,但是最好用@Autowired,原因請看下文
9、@Resource默認按name匹配,,當有一個接口有多個實現類的時候,引用都是一個接口,不好區分,才使用name區分,這種情況使用@Resource和@Autowired都可以,推薦使用@Resource,且都是按name匹配,一般不用type匹配,引用的是同一個接口,同一個type
還有一種方式:使用byType類型時,使用@Service+@Primary組合,一個接口當有多個實現類,,@Primary強制指定一個實現類
10、@Autowired默認按type匹配,,當有一個接口只有有一個實現類的時候,引用是一個接口,只有一個實現類,沒必要使用name區分,這種情況使用@Resource和@Autowired都可以,推薦使用@Autowired,一般都是按type匹配,也可以按name匹配,比較麻煩不推薦
(比如:一個與世隔絕的村子,只有一個姓李的人,大家叫他“老李”,都知道他是誰,就沒必要叫名字。但是這個村要是有2-100姓李的,你叫“老李”,大家就不知道是叫誰了,這時候就要加名字。type=姓 name=名;如果有個姓李的,十分厲害,十分有名,那可能叫“老李”,就特指他一個人,優先級最高 ,等價於@Primary)
總結:
當一個接口只有一個實現類,推薦使用@Autowired,默認byType注入,不一定 真的byType,可以修改為byName,@Resource同理;
當一個接口有多個實現類,推薦使用@Resource,默認byName注入;
具體情況具體分析 : 比如當一個接口有多個實現類,用@Primary 告訴spring 在猶豫的時候(byName是不會猶豫的,會確定一個唯一實現類,@Primary沒有意義)優先選擇哪一個具體的實現。spring優先注入@Primary修飾的那個;或者使用@Qualifier來標注需要注入的類。
@Service是注入,生成bean實例,既有type也有name. @Service標注名稱,如@Service(“Benz”),則bean的名稱就是Benz,如果不標注,@Service(),spring會默認注入一個beanName,要注意特殊情況,看上文
@Autowired和@Resource只是查找匹配,然后給屬性賦值。private Car car;
@Service public class CarFactory { @Resource(name="benz")//byName匹配,此時beanName=benz;如果將(name="benz")去掉,beanName=car,即屬性名;只要byName匹配不到,就會使用byType匹配 private Car car; public String toString(){ return car.carName(); } public void Test(){ System.out.println("it is ok!"); } }
如果@Resource(name="benz")換成@Autowired+@Qualifier(“benz”),此時也是按照byName,此時beanName=benz,如果再去掉@Qualifier(“benz”),就是byType匹配,beanType=XXX.Car.class
注意 :@Autowired和@Resource只是匹配beanName,決定注入beanName的是@service()括號內的name(沒有的話spring會自動生成一個,有一個特殊情況請看上文)或 spring的xml配置里 <bean id="benz" class="com.xrq.annotation.Benz" /> 的id=name(xml配置優先)
