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;