1. 程式人生 > >Spring基於建構函式和設值函式的依賴注入

Spring基於建構函式和設值函式的依賴注入

基於建構函式的依賴注入

我們知道,bean標籤中指定的類會進行初始化,這個初始化過程中自然會呼叫建構函式,那我們也可以利用這個建構函式完成依賴注入。

先建立一個類:

public class TextEditor {
    public TextEditor(SpellChecker spellChecker) {
        System.out.println("TextEditor的建構函式");
    }

    public TextEditor(String s) {
        System.out.println(s);
    }
}

如上,可以看見有兩個建構函式。

第一個建構函式的引數是自定義型別,第二個是一個字串型別。兩種不同的引數型別在配置檔案中的寫法是不一樣的,下面會提到。

再建立一個測試類:

public class MainApps {
    public static void main(String[] args) {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        TextEditor editor = (TextEditor) context.getBean("text");
    }
}

配置檔案內容如下:

<bean id="text" class="Dependency.injection.TextEditor">
     <constructor-arg type="java.lang.String" value="這是一個建構函式注入的值"/>
</bean>

配置檔案中,除了常見的bean標籤,需要使用constructor-arg標籤來完成建構函式的注入。

執行測試類輸出:

這是一個建構函式注入的值

如果向呼叫上面一個建構函式,配置檔案內容如下:

<bean id="text" class="Dependency.injection.TextEditor">
  <constructor-arg ref="spellChecker"/>
</bean>
<bean id="spellChecker" class="Dependency.injection.SpellChecker"/>

注意:

1.如果你需要傳遞一個物件的引用,就直接用ref;如果你需要傳遞一個java自帶的資料型別,則需要先在type裡宣告型別,再用value設定值。

2.如果構造引數的引數列表有多個引數,則傳遞的順序就是引數列表的順序。

 

基於設值函式的依賴注入

通過bean呼叫設值函式來完成依賴注入。

先準備一個類:

public class TextEditor {
    private String name;
    //設值函式
    public void setName(String name) {
        this.name = name;
    }

    public void getName() {
        System.out.println(this.name);
    }

}

注意私有屬性name,下面會通過bean設定這個屬性的值。

再準備一個測試類:

public class MainApps {
    public static void main(String[] args) {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        TextEditor editor = (TextEditor) context.getBean("text");
        editor.getName();
    }
}

配置檔案內容如下:

<bean id="text" class="Dependency.injection.TextEditor">
  <property name="name" value="李四"/>
</bean>

執行測試類輸出:

李四

注意:

1.設值函式也可以傳遞引用,同樣使用ref。

2.配置檔案中,設值函式用的是property。建構函式注入用的是constructor-arg

&n