1. 程式人生 > >spring註解與xml同時使用:bean命名問題及衝突

spring註解與xml同時使用:bean命名問題及衝突

主程式如下,基於spring的依賴注入:

public class UserServImpl implements UserServ{

@autowired

private UserDao userDao;

....

}

1、xml中配置bean id 與類名一致:

<bean id="UserServ"  class="com.impl.UserServImpl" />

<bean id="UserDao"  class="com.db.UserDao" />

整個spring容器有且只有一個UserDao例項,autowired通過 byType自動裝載,程式正常執行;

2、xml中配置兩個bean id與類名一致,這裡注意大小寫

<bean id="UserServ"  class="com.impl.UserServImpl" />

<bean id="UserDao"  class="com.db.UserDao" />

<bean id="userDao"  class="com.db.UserDao" />

spring容器有多個類UserDao的例項時,autowired通過 byName裝載,由於autowired沒有顯式標明待注入的例項名稱name,程式自動裝載name為userDao的例項,程式正常執行;同時說明bean中name預設與id名是相同的,在3中有證明。

3、xml中配置兩個bean id與類名不一致

<bean id="UserServ"  class="com.impl.UserServImpl" />

<bean id="UserDao"  class="com.db.UserDao" />

<bean id="userDaoAAA"  class="com.db.UserDao" />

spring容器有多個UserDao例項,autowired通過型別 byName裝載,由於autowired沒有顯式標明注入的例項名稱name,程式自動裝載name為userDao的例項,由於bean預設name與id一致,spring無法找到名字為userDao的例項,程式報錯;證明了2的結論。

4、xml與註解同時使用,且名稱相同

註解如下

@Service("UserDao")

public class UserDao {

}

配置如下

<bean id="UserServ"  class="com.impl.UserServImpl" />

<bean id="UserDao"  class="com.db.UserDao" />

當出現兩個相同名稱例項,spring會覆蓋其中一個,xml優先順序高於註解;xml中同時配置兩個相同id的bean,直接校驗不通過報錯。

覆蓋程式碼列印如下:

- Overriding bean definition for bean 'UserDao': replacing [Generic bean: class [com.UserDao]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; 

5、xml與註解同時使用,beand的id不同,結果同2和3;