Spring的自動裝配
好處:大幅度減少Spring配置
壞處:依賴不能明確管理,可能會有多個bean同時符合注入規則,沒有清晰的依賴關係。
在裝配的時候會有兩種方式,byName和byType兩種。
byName:根據屬性名自動裝配。此選項將檢查容器並根據名字查找與屬性完全一致的bean,並將其與屬性自動裝配。
byType:如果容器中存在一個與指定屬性類型相同的bean,那麼將與該屬性自動裝配;如果存在多個該類型bean,那麼拋出異常,並指出不能使用byType方式進行自動裝配;如果沒有找到相匹配的bean,則什麼事都不發生,也可以通過設置
看代碼:
UserDAO的實現類 有一個屬性daoId
public class UserDAOImpl implements UserDAO {
private int daoId;
public int getDaoId() {
return daoId;
}
public void setDaoId(int daoId) {
this.daoId = daoId;
}
public void save(User user) {
System.out.println("user saved!");
}
@Override
public String toString() {
return "daoId=" + daoId;
}
}
UserService 依賴了UserDAO
public class UserService {
private UserDAO userDAO;
public void add(User user) {
userDAO.save(user);
}
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!--第一個UserDAO bean-->
<bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl">
<property name="daoId" value="1"></property>
</bean>
<!--第二個UserDAO bean-->
<bean name="userDAO2" class="com.bjsxt.dao.impl.UserDAOImpl">
<property name="daoId" value="2"></property>
</bean>
<!-- 這裏的byName是按照屬性名進行匹配 這裏我們並沒有注入UserDAO
但是你的UserService屬性名稱是UserDAO 所以就相當於 你注入了UserDAO
相當於在bean中添加<property name="userDAO" ref="userDAO"/> 一樣
-->
<bean id="userService" class="com.bjsxt.service.UserService" autowire="byName">
</bean>
<!--需要注意的是在UserService類中,一定要有一個名爲setUserDao的構造方法,其中setter
方法名要與bean的id對應set+name,name首字母大寫,否則無法成功注入-->
</beans>
測試:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
UserService service = (UserService)ctx.getBean("userService");
System.out.println(service.getUserDAO());
//打印出來是1 說明默認注入的是UserDAO
改成byType的話是按照類型自動裝配:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!--第一個UserDAO bean-->
<bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl">
<property name="daoId" value="1"></property>
</bean>
<!--第二個UserDAO bean,這裏需要刪除掉一個,類型相同的多個bean通過byType
注入時會報錯
<bean name="userDAO2" class="com.bjsxt.dao.impl.UserDAOImpl">
<property name="daoId" value="2"></property>
</bean>
-->
<!-- autowire修改爲"byType",重點是保證-->
<bean id="userService" class="com.bjsxt.service.UserService" autowire="byType">
</bean>
<!--需要注意的是在UserService類中,一定要有一個名爲setUserDao的構造方法,被裝配類中的
setter方法的參數類型要與bean的class的類型一樣,否則無法成功注入-->
</beans>