首先先理解下: Spring中的byName與byType
1.首先,區分清楚什么是byType,什么是byName。
<bean id="userServiceImpl" class="cn.com.service.impl.UserServiceImpl" autowire="byName"> </bean> <bean id="userDao" class="cn.com.dao.impl.UserDaoImpl"> </bean>
比如說如上這段代碼,byName
就是通過Bean的id或者name,byType
就是按Bean的Class的類型。
若autowire="byType"意思是通過 class="cn.com.dao.impl.UserDaoImpl"來查找UserDaoImpl下所有的對象。
代碼autowire="byName"意思是通過id="userDao"來查找Bean中的userDao對象.
自動裝配 Bean 屬性
在spring中@Autowired注入規則:
1.@Autowired默認是按照byType進行注入的
xml中語法如下:<bean id="beanId" class="包名.類名">
如果是屬性注入,需要為每一個依賴類創建相應的getter和setter方法。
如果是構造方法注入,需要為依賴類創建相應的構造方法。
屬性注入的語法如下:
<bean id="被注入的類的beanId" class="包名.類名" /> <bean id="beanId" class="包名.類名"> <property name="被注入的bean的名字" ref="被注入的類的beanId"></property> </bean>
相同點:
@Resource的作用相當於@Autowired,均可標注在字段或屬性的setter方法上。
不同點:
(1)提供方:@Autowired是由org.springframework.beans.factory.annotation.Autowired提供,換句話說就是由Spring提供;@Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。
(2)注入方式:@Autowired只按照byType 注入;@Resource默認按byName自動注入,也提供按照byType 注入;
(3)屬性:@Autowired按類型裝配依賴對象,默認情況下它要求依賴對象必須存在,如果允許null值,可以設置它required屬性為false。如果我們想使用按名稱裝配,可以結合@Qualifier注解一起使用。@Resource有兩個中重要的屬性:name和type。name屬性指定byName,如果沒有指定name屬性,當注解標注在字段上,即默認取字段的名稱作為bean名稱尋找依賴對象,當注解標注在屬性的setter方法上,即默認取屬性名作為bean名稱尋找依賴對象。需要注意的是,@Resource如果沒有指定name屬性,並且按照默認的名稱仍然找不到依賴對象時, @Resource注解會回退到按類型裝配。但一旦指定了name屬性,就只能按名稱裝配了。