@Autowired 和@Resource的區別
主要是一點,自動注入優先級的問題:
@Resource : 優先級name > type
@Autowired :優先級qualifier > type > name
@Resource
-
是jdk的註解
-
優先以name屬性來注入bean。沒有name屬性,將以變量名名作爲name屬性值
測試一: //注入 @Resource User user; //xml配置 //類型不同但ID相同 <bean id="user" class="com.ssm.pojo.People"> <property name="name" value="test - user"/> </bean> //類型相同,但ID不同 <bean id="user1" class="com.ssm.pojo.User"> <property name="name" value="test-user1 "/> </bean>
結果 :注入失敗
失敗原因 :spring在注入name = user的bean時,但是類型不匹配
結果分析 :證明了@resource優先匹配name屬性相同的bean,而不是匹配type屬性相同的bean。所以注入的是id相同的user,而不是類型相同的user1
-
再以類型來匹配bean,當容器中沒有name屬性對應的bean時
-
@qualifier對resource不生效
測試二: //注入 @Resource @Qualifier("user1") User user; //xml配置如下 <bean id="user" class="com.ssm.pojo.User"> <property name="name" value="test - user"/> </bean> <bean id="user1" class="com.ssm.pojo.User"> <property name="name" value="test-user1 "/> </bean>
結果:注入的是user
分析:@Qualifier(“user1”)沒有生效,以變量名作爲name屬性匹配bean,所以注入的是user
@autowired
-
是spring框架的註解
-
優先以@qualifier註解限制的bean來注入bean
測試三: //注入 @Autowired @Qualifier("user1") User user; //xml配置如下 <bean id="user" class="com.ssm.pojo.User"> <property name="name" value="test - user"/> </bean> <bean id="user1" class="com.ssm.pojo.People"> <property name="name" value="test-user1 "/> </bean>
結果: 注入失敗
分析 : 以@Qualifier限定的id來匹配,所以注入的是user1, 導致注入的類型不同,而注入失敗。如果以type爲優先,那麼回優先注入user
-
沒有@Qualiifer,在以Type來注入
測試四: //注入 @Autowired User user; //xml配置 //類型不同但ID相同 <bean id="user" class="com.ssm.pojo.People"> <property name="name" value="test - user"/> </bean> //類型相同,但ID不同 <bean id="user1" class="com.ssm.pojo.User"> <property name="name" value="test-user1 "/> </bean>
結果: 注入成功
分析:優先以類型來注入,那麼使用的就是user1這個bean,類型相同,能夠注入成功。測試一中是以name爲優先級,所以注入失敗
-
最後在以name來注入,但是autowired沒有name屬性,所以默認以變量名作爲匹配