Spring的自動裝配 byName和byType的區別

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> 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章