位置:首頁 > Java技術 > Spring > Spring構造函數為基礎的依賴注入

Spring構造函數為基礎的依賴注入

當容器調用類的構造函數有多個參數,每個代表在其他類中的構造函數依賴關係為基礎的DI來完成。

例子:

下麵的例子顯示了一個類文本編輯TextEditor 隻能是依賴注入與構造函數注入。

我們使用Eclipse IDE,然後按照下麵的步驟來創建一個Spring應用程序:

步驟 描述
1 Create a project with a name SpringExample and create a package com.yiibai under the src folder in the created project.
2 Add required Spring libraries using Add External JARs option as explained in the Spring Hello World Example chapter.
3 Create Java classes TextEditorSpellChecker and MainApp under the com.yiibaipackage.
4 Create Beans configuration file Beans.xml under the src folder.
5 The final step is to create the content of all the Java files and Bean Configuration file and run the application as explained below.

這裡是TextEditor.java文件的內容:

package com.yiibai;

public class TextEditor {
   private SpellChecker spellChecker;

   public TextEditor(SpellChecker spellChecker) {
      System.out.println("Inside TextEditor constructor." );
      this.spellChecker = spellChecker;
   }
   public void spellCheck() {
      spellChecker.checkSpelling();
   }
}

下麵是另外一個相關的類文件SpellChecker.java內容:

package com.yiibai;

public class SpellChecker {
   public SpellChecker(){
      System.out.println("Inside SpellChecker constructor." );
   }

   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   }
   
}

以下是MainApp.java文件的內容:

package com.yiibai;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");

      TextEditor te = (TextEditor) context.getBean("textEditor");

      te.spellCheck();
   }
}

以下是配置文件beans.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-3.0.xsd">

   <!-- Definition for textEditor bean -->
   <bean id="textEditor" class="com.yiibai.TextEditor">
      <constructor-arg ref="spellChecker"/>
   </bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.yiibai.SpellChecker">
   </bean>

</beans>

創建源代碼和bean配置文件完成後,讓我們運行應用程序。如果一切順利將打印以下信息:

Inside SpellChecker constructor.
Inside TextEditor constructor.
Inside checkSpelling.

構造函數的參數解析:

可能有歧義存在,而將參數傳遞給構造函數的情況下有一個以上的參數。要解決這種不確定性,其中的構造器參數在一個bean定義中定義的順序就是這些參數提供給適當的構造函數的順序。請考慮下麵的類:

package x.y;

public class Foo {
   public Foo(Bar bar, Baz baz) {
      // ...
   }
}

下麵的配置工作正常:

<beans>
   <bean id="foo" class="x.y.Foo">
      <constructor-arg ref="bar"/>
      <constructor-arg ref="baz"/>
   </bean>

   <bean id="bar" class="x.y.Bar"/>
   <bean id="baz" class="x.y.Baz"/>
</beans>

讓我們檢查一個更多情況下我們通過不同類型的構造函數。請考慮下麵的類:

package x.y;

public class Foo {
   public Foo(int year, String name) {
      // ...
   }
}

容器也可以使用類型匹配與簡單類型,如果你明確地指定使用type屬性的構造函數的參數類型。例如:

<beans>

   <bean id="exampleBean" class="examples.ExampleBean">
      <constructor-arg type="int" value="2001"/>
      <constructor-arg type="java.lang.String" value="Zara"/>
   </bean>

</beans>

最後,並通過構造函數參數的最佳方法,使用索引屬性來顯式地指定一個構造器參數的索引。這裡的索引是從0開始。例如:

<beans>

   <bean id="exampleBean" class="examples.ExampleBean">
      <constructor-arg index="0" value="2001"/>
      <constructor-arg index="1" value="Zara"/>
   </bean>

</beans>

最後需要說明的,如果你傳遞一個引用到一個對象,需要使用<constructor-arg>標簽的ref屬性,如果是直接傳遞一個值,那麼應該使用value屬性,如上圖所示。