Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)
http://moshowgame.iteye.com/blog/1607718
@Autowired自動裝配
上面的例子我們用的都是手動裝配的,如果DAO-Service一多那就很麻煩了,那么我們需要偷懶一下,然spring去幫我們自動裝配,自動裝配的類型有兩種,一種是byName,一種是byType。
?
*。如果是XML版,只需要在bean里面加個?autowire="byXXX"就行了。
重寫一下DAO.Impl的toString()方法來做測試,看看注入的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>
-----------------------------------------------------------------------------------------
?
?①這樣的運行結果是null,因為是byName按名字分配的,沒有和userDAO的名字相同,如果將"userDAO1"改為"userDAO"則輸出daoID=1,同理可得改"userDAO2"為"userDAO"則輸出daoID=2。
?
②記得不能兩個同時改為"userDAO",否則報錯,找到兩個同名,不知道配那個。
?
?③如果直接修改?autowire="byType"會報錯,
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]
就是說找到兩個不知道配哪個好......(?-?-?)
?
④將"userDAO2"的bean用<!--?-->注釋掉,然后改autowire="byType",則輸出的是daoID=1.
或將"userDAO1"的bean用<!--?-->注釋掉,然后改autowire="byType",則輸出的是daoID=2.
-?-要是兩個同時注釋掉的話,注意是不會報錯,因為沒得裝配了,跟①的情況差不多,只能輸出null。
?
?
Annotation版本的@Autowired自動裝配
?
首先得對UserService類的setter注入做做改進,如果是用constructor則對構造方法進行改進,方法和道理一樣。
?
-----------------------------------------------------------------------------------------
<!--如果XML里面只有一個可以裝配,那么setter直接加個@Autowired以就可以了.-->
?
<bean?id="u1"
?class="com.bjsxt.dao.impl.UserDAOImpl">
??</bean>
-----------------------------------------------------------------------------------------
@Autowired
public?void?setUserDAO(UserDAO?userDAO)?{
this.userDAO?=?userDAO;
}
-----------------------------------------------------------------------------------------
<!--如果XML里面有多個可以裝配,那么setter上面加個@Autowired之外還要在參數里面加個@Qualifier("u1")指定裝配的是哪個對象-->
?
?<bean?id="u1"?class="com.bjsxt.dao.impl.UserDAOImpl">
??</bean>
??<bean?id="u2"?class="com.bjsxt.dao.impl.UserDAOImpl">
??</bean>
-----------------------------------------------------------------------------------------
//加個@Autowired以及指定注入的是u1?@Qualifier("u1")
?
@Autowired
public?void?setUserDAO(@Qualifier("u1")?UserDAO?userDAO)?{
this.userDAO?=?userDAO;
}
?
-----------------------------------------------------------------------------------------
補充:@Resource的用法:
跟@autowired差不多,不過默認是用byName,得名字完全對應才能自動裝配
@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版本源碼全部經Junit測試成功!
⊙_⊙最后,按照我的慣例,附上本次的項目源碼三個(XML和Annotation版本,還有補充的@Resource的,源碼來自尚學堂馬士兵),類庫用到三個(spring.jar ?junit.jar(eclipse自帶) commons-logging.jar 缺少類庫到http://moshowgame.iteye.com/admin/blogs/1606825下載)。
^_^還有什么好方法或者疑問和意見歡迎大家提出來一起討論!
?
總結
以上是生活随笔為你收集整理的Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 凤凰涅槃:从 iBatis 到 MyBa
- 下一篇: XML Schema介绍之namespa