Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)
http://moshowgame.iteye.com/blog/1607718
@Autowired自動(dòng)裝配
上面的例子我們用的都是手動(dòng)裝配的,如果DAO-Service一多那就很麻煩了,那么我們需要偷懶一下,然spring去幫我們自動(dòng)裝配,自動(dòng)裝配的類型有兩種,一種是byName,一種是byType。
?
*。如果是XML版,只需要在bean里面加個(gè)?autowire="byXXX"就行了。
重寫(xiě)一下DAO.Impl的toString()方法來(lái)做測(cè)試,看看注入的ID。
@Override
public?String?toString()?{
return?"daoId="?+?daoId;
}
-----------------------------------------------------------------------------------------
?<bean?name="userDAO1"?class="com.bjsxt.dao.impl.UserDAOImpl">
?? <property?name="daoId"?value="1"></property>
??</bean>
??
?<bean?name="userDAO2"?class="com.bjsxt.dao.impl.UserDAOImpl">
?? <property?name="daoId"?value="2"></property>
??</bean>
??<bean?id="userService"?class="com.bjsxt.service.UserService"?scope="prototype"?autowire="byName">
??</bean>
-----------------------------------------------------------------------------------------
?
?①這樣的運(yùn)行結(jié)果是null,因?yàn)槭?span style="font-family:'宋體'; color:#ff00ff; background:#d9d9d9; font-size:14pt; font-weight:bold">byName按名字分配的,沒(méi)有和userDAO的名字相同,如果將"userDAO1"改為"userDAO"則輸出daoID=1,同理可得改"userDAO2"為"userDAO"則輸出daoID=2。
?
②記得不能兩個(gè)同時(shí)改為"userDAO",否則報(bào)錯(cuò),找到兩個(gè)同名,不知道配那個(gè)。
?
?③如果直接修改?autowire="byType"會(huì)報(bào)錯(cuò),
Error?creating?bean?with?name?'userService'?defined?in?class?path?resource?[beans.xml]:?Unsatisfied?dependency?expressed?through?bean?property?'userDAO':?:?No?unique?bean?of?type?[com.bjsxt.dao.UserDAO]?is?defined:?expected?single?matching?bean?but?found?2:?[userDAO1,?userDAO2];?nested?exception?is?org.springframework.beans.factory.NoSuchBeanDefinitionException:?No?unique?bean?of?type?[com.bjsxt.dao.UserDAO]?is?defined:?expected?single?matching?bean?but?found?2:?[userDAO1,?userDAO2]
就是說(shuō)找到兩個(gè)不知道配哪個(gè)好......(?-?-?)
?
④將"userDAO2"的bean用<!--?-->注釋掉,然后改autowire="byType",則輸出的是daoID=1.
或?qū)?/span>"userDAO1"的bean用<!--?-->注釋掉,然后改autowire="byType",則輸出的是daoID=2.
-?-要是兩個(gè)同時(shí)注釋掉的話,注意是不會(huì)報(bào)錯(cuò),因?yàn)闆](méi)得裝配了,跟①的情況差不多,只能輸出null。
?
?
Annotation版本的@Autowired自動(dòng)裝配
?
首先得對(duì)UserService類的setter注入做做改進(jìn),如果是用constructor則對(duì)構(gòu)造方法進(jìn)行改進(jìn),方法和道理一樣。
?
-----------------------------------------------------------------------------------------
<!--如果XML里面只有一個(gè)可以裝配,那么setter直接加個(gè)@Autowired以就可以了.-->
?
<bean?id="u1"
?class="com.bjsxt.dao.impl.UserDAOImpl">
??</bean>
-----------------------------------------------------------------------------------------
@Autowired
public?void?setUserDAO(UserDAO?userDAO)?{
this.userDAO?=?userDAO;
}
-----------------------------------------------------------------------------------------
<!--如果XML里面有多個(gè)可以裝配,那么setter上面加個(gè)@Autowired之外還要在參數(shù)里面加個(gè)@Qualifier("u1")指定裝配的是哪個(gè)對(duì)象-->
?
?<bean?id="u1"?class="com.bjsxt.dao.impl.UserDAOImpl">
??</bean>
??<bean?id="u2"?class="com.bjsxt.dao.impl.UserDAOImpl">
??</bean>
-----------------------------------------------------------------------------------------
//加個(gè)@Autowired以及指定注入的是u1?@Qualifier("u1")
?
@Autowired
public?void?setUserDAO(@Qualifier("u1")?UserDAO?userDAO)?{
this.userDAO?=?userDAO;
}
?
-----------------------------------------------------------------------------------------
補(bǔ)充:@Resource的用法:
跟@autowired差不多,不過(guò)默認(rèn)是用byName,得名字完全對(duì)應(yīng)才能自動(dòng)裝配
@Resource
public void setUserDAO( UserDAO userDAO) {
this.userDAO = userDAO;
}
-----------------------------------------------------------------------------------------
? <bean id="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl">
? </bean>
? <bean id="u2" class="com.bjsxt.dao.impl.UserDAOImpl">
? </bean>
-----------------------------------------------------------------------------------------
XML和Annotation版本源碼全部經(jīng)Junit測(cè)試成功!
⊙_⊙最后,按照我的慣例,附上本次的項(xiàng)目源碼三個(gè)(XML和Annotation版本,還有補(bǔ)充的@Resource的,源碼來(lái)自尚學(xué)堂馬士兵),類庫(kù)用到三個(gè)(spring.jar ?junit.jar(eclipse自帶) commons-logging.jar 缺少類庫(kù)到http://moshowgame.iteye.com/admin/blogs/1606825下載)。
^_^還有什么好方法或者疑問(wèn)和意見(jiàn)歡迎大家提出來(lái)一起討論!
?
總結(jié)
以上是生活随笔為你收集整理的Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 凤凰涅槃:从 iBatis 到 MyBa
- 下一篇: Clojure 学习