依賴注入的方式(DI)

方式:java

  1. 接口注入;
  2. setter方法注入;
  3. 構造方法注入;
接口注入:
public class ClassA { 

  private InterfaceB clzB; 

  public void doSomething() { 

    Ojbect obj = Class.forName(Config.BImplementation).newInstance(); 

    clzB = (InterfaceB)obj; 

    clzB.doIt();  

  } 

…… 

}

 

 

解釋一下上述的代碼部分,ClassA依賴於InterfaceB的實現,咱們如何得到InterfaceB的實現實例呢?傳統的方法是在代碼中建立 InterfaceB實現類的實例,並將賦予clzB.這樣一來,ClassA在編譯期即依賴於InterfaceB的實現。爲了將調用者與實現者在編譯期分離,因而有了上面的代碼。咱們根據預先在配置文件中設定的實現類的類名(Config.BImplementation),動態加載實現類,並經過InterfaceB強制轉型後爲ClassA所用,這就是接口注入的一個最原始的雛形。 程序員

setter注入:

setter注入模式在實際開發中有很是普遍的應用,setter方法更加直觀,咱們來看一下spring的配置文件:spring

 

    <!-- 使用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> 

        <property name="id" value="123"></property>   

    </bean>   


接着咱們來看一下,setter表示依賴關係的寫法:sql

public class UserManagerImpl implements UserManager{   

   

private UserDao userDao;   

 

private int id;

   

    //使用設值方式賦值   

    public void setUserDao(UserDao userDao) {   

        this.userDao = userDao;   

}  

    //使用設值方式賦值   

    public void setId(int id) {   

        this.userDao = id;   

    }   

       

    @Override   

    public void addUser(String userName, String password) {   

   

        userDao.addUser(userName, password);   

    }   

}   
構造器注入:

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

   <!-- 使用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>

咱們再來看一下,構造器表示依賴關係的寫法,代碼以下所示:函數

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注入<>構造器注入   比較

接口注入:this

         接口注入模式由於具有侵入性,它要求組件必須與特定的接口相關聯,所以並不被看好,實際使用有限spa

code

Setter 注入:對象

         對於習慣了傳統 javabean 開發的程序員,經過 setter 方法設定依賴關係更加直觀。若是依賴關係較爲複雜,那麼構造子注入模式的構造函數也會至關龐大,而此時設值注入模式則更爲簡潔。若是用到了第三方類庫,可能要求咱們的組件提供一個默認的構造函數,此時構造子注入模式也不適用。

 

構造器注入:

         在構造期間完成一個完整的、合法的對象。全部依賴關係在構造函數中集中呈現。依賴關係在構造時由容器一次性設定,組件被建立以後一直處於相對「不變」的穩定狀態。只有組件的建立者關心其內部依賴關係,對調用者而言,該依賴關係處於「黑盒」之中。

相關文章
相關標籤/搜索