spring的IOC——依賴注入的兩種實現類型


一、構造器注入:

  構造器注入,即通過構造函數完成依賴關系的設定。我們看一下spring的配置文件:

<constructor-arg ref="userDao4Oracle"/> 
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xmlns:aop="http://www.springframework.org/schema/aop"  
         xmlns:tx="http://www.springframework.org/schema/tx"  
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd  
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd  
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">  
  
    <!-- 使用spring管理對象的創建,還有對象的依賴關系 -->  
    <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>  
  
    <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>  
      
    <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">  
        <!-- (1)userManager使用了userDao,Ioc是自動創建相應的UserDao實現,都是由容器管理-->  
        <!-- (2)在UserManager中提供構造函數,讓spring將UserDao實現注入(DI)過來 -->  
        <!-- (3)讓spring管理我們對象的創建和依賴關系,必須將依賴關系配置到spring的核心配置文件中 -->  
  
        <constructor-arg ref="userDao4Oracle"/>  
    </bean>  
      
</beans>  

我們再看一下,構造器表示依賴關系的寫法:

public class UserManagerImpl implements UserManager{  
  
    private UserDao userDao;  
  
    //使用構造方式賦值  
    public UserManagerImpl(UserDao userDao) {  
        this.userDao = userDao;  
    }  
  
    @Override  
    public void addUser(String userName, String password) {  
  
        userDao.addUser(userName, password);  
    }  
} 

二、設值注入(Setter)

設值注入模式在實際開發中得到了最廣泛的應用,在LZ看來,基於設值模式的依賴注入機制更加直觀、也更加的自然。我們看一下spring的配置文件:

 <property name="userDao" ref="userDao4Oracle"></property> 
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xmlns:aop="http://www.springframework.org/schema/aop"  
         xmlns:tx="http://www.springframework.org/schema/tx"  
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd  
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd  
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">  
  
    <!-- 使用spring管理對象的創建,還有對象的依賴關系 -->  
    <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>  
  
    <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>  
      
    <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">  
        <!-- (1)userManager使用了userDao,Ioc是自動創建相應的UserDao實現,都是由容器管理-->  
        <!-- (2)在UserManager中提供構造函數,讓spring將UserDao實現注入(DI)過來 -->  
        <!-- (3)讓spring管理我們對象的創建和依賴關系,必須將依賴關系配置到spring的核心配置文件中 -->  
  
        <property name="userDao" ref="userDao4Oracle"></property>  
    </bean>  
      
</beans>  

我們再看一下,設值表示依賴關系的寫法:

public class UserManagerImpl implements UserManager{  
  
    private UserDao userDao;  
  
    //使用設值方式賦值  
    public void setUserDao(UserDao userDao) {  
        this.userDao = userDao;  
    }  
      
    @Override  
    public void addUser(String userName, String password) {  
  
        userDao.addUser(userName, password);  
    }  
}  

三、對比:

不同點:

      構造方法與設值方法最重要的不同點只是創建對象的時機不同。

      構造方法是當實例化對象時執行的即“在構造期即創建一個完整、合法的對象”,例如我們的Dao對象就想在實例化UserManager的時候傳值,那么我們必須要用構造方法。如果我們沒有這樣的需求的話,我們完全可以使用設值方法。

 

構造器方式的優勢:

 

1、在構造期即創建一個完整、合法的對象。

2、避免了繁瑣的Setter方式的編寫,所有的依賴關系都在構造函數中設定。

3、沒有Setter方法,依賴關系在構造時由容器一次性設定,因此組件在被創建之后即處於相對“不變”的穩定狀態。

 

設值方式的優勢:

 

1、對於習慣了傳統JavaBean開發的程序員而言,通過setter方法設定依賴關系顯得更加直觀,更加自然。

2、如果依賴關系(或繼承關系)較為復雜,那么構造方法的構造函數也會相當龐大(我們需要在構造函數中設定所有依賴關系),此時設值方式往往更為簡潔。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM