Spring的IOC逐層深刻——依賴注入的兩種實現類型(四)

構造器注入

   

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

 

[html] view plain copyjava

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

咱們再看一下,構造器表示依賴關係的寫法:程序員

 

 

[java] view plain copyspring

  1. import com.tgb.spring.dao.UserDao;  
  2.   
  3. public class UserManagerImpl implements UserManager{  
  4.   
  5.     private UserDao userDao;  
  6.   
  7.     //使用構造方式賦值  
  8.     public UserManagerImpl(UserDao userDao) {  
  9.         this.userDao = userDao;  
  10.     }  
  11.   
  12.     @Override  
  13.     public void addUser(String userName, String password) {  
  14.   
  15.         userDao.addUser(userName, password);  
  16.     }  
  17. }  

 

設值注入(Setter)

 

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

 

[html] view plain copyide

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

咱們再看一下,設值表示依賴關係的寫法:函數

[java] view plain copythis

  1. import com.tgb.spring.dao.UserDao;  
  2.   
  3. public class UserManagerImpl implements UserManager{  
  4.   
  5.     private UserDao userDao;  
  6.   
  7.     //使用設值方式賦值  
  8.     public void setUserDao(UserDao userDao) {  
  9.         this.userDao = userDao;  
  10.     }  
  11.       
  12.     @Override  
  13.     public void addUser(String userName, String password) {  
  14.   
  15.         userDao.addUser(userName, password);  
  16.     }  
  17. }  

 

       從上面的代碼,咱們能夠發現,無論是構造器方式仍是設值方式,只有兩處寫法不太同樣,一是配置spring的配置文件,二是在依賴關係的寫法不一樣,但都能根據名稱區別開,下面咱們再對比它們各自的優點。spa

  

對比

 

 

相同點:.net

       

       構造器和設值的依賴注入實現模式均具有無侵入性的特色。而且這兩種實現方式各有特色,也各有優點(一句經典廢話大笑)。

  

不一樣點:

           

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

      構造方法是當實例化對象時執行的即「在構造期即建立一個完整、合法的對象」,例如咱們的Dao對象就想在實例化UserManager的時候傳值,那麼咱們必需要用構造方法。若是咱們沒有這樣的需求的話,咱們徹底可使用設值方法。

 

構造器方式的優點:

 

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

二、避免了繁瑣的Setter方式的編寫,全部的依賴關係都在構造函數中設定。

三、沒有Setter方法,依賴關係在構造時由容器一次性設定,所以組件在被建立以後即處於相對「不變」的穩定狀態。

 

設值方式的優點:

 

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

二、若是依賴關係(或繼承關係)較爲複雜,那麼構造方法的構造函數也會至關龐大(咱們須要在構造函數中設定全部依賴關係),此時設值方式每每更爲簡潔。

 

總結

 

        構造器方式和設值方式,各有千秋,而spring對這種類型的注入方式都提供了良好的支持。不過對於基於Spring開發的應用而言,設值方式使用的更加普遍。

相關文章
相關標籤/搜索