1. 程式人生 > >Spring——注入分類

Spring——注入分類

Bean 例項在呼叫無參構造器建立了空值物件後,就要對 Bean 物件的屬性進行初始化。
初始化是由容器自動完成的,稱為注入。根據注入方式的不同,常用的有兩類:設值注入、構造注入。還有另外一種,實現特定介面注入。由於這種方式採用侵入式程式設計,汙染了程式碼,所以幾乎不用。

(1)設值注入
設值注入是指,通過 setter 方法傳入被呼叫者的例項。這種注入方式簡單、直觀,因而在 Spring 的依賴注入中大量使用。

先定義school的實體物件:

package com.bjpowernode.di01;

public class School {
    private
String name; public void setName(String name) { this.name = name; } @Override public String toString() { return "School [name=" + name + "]"; } }

定義學生類物件實體:

package com.bjpowernode.di01;

public class Student {
    private String name;
    private int age;
    private
School school; // 物件屬性,域屬性 public void setName(String name) { System.out.println("執行setName()"); this.name = name; } public void setAge(int age) { System.out.println("執行setAge()"); this.age = age; } public void setSchool(School school) { this
.school = school; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", school=" + school + "]"; } }

這裡需要注意兩個地方,一個是把school封裝以後放在Student裡面當作成員物件。第二個是在進行編輯實體物件的時候最好把所有的set/get方法新增上去(對於新手來說)。

配置檔案:

<?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.xsd">

    <!-- 註冊School -->
    <bean id="mySchool" class="com.bjpowernode.di01.School">
        <property name="name" value="清華大學"/>
    </bean>

    <!-- 註冊Student ---下面的name要和Student裡面的name進行一一對應--->
    <bean id="myStudent" class="com.bjpowernode.di01.Student">
        <property name="name" value="張三"/>
        <property name="age" value="23"/>
        <property name="school" ref="mySchool"/>
    </bean>

</beans>

當指定 bean 的某屬性值為另一 bean 的例項時,通過 ref 指定它們間的引用關係。ref 的值必須為某bean 的 id 值。對於其它 Bean 物件的引用,除了標籤的 ref 屬性外,還可以使用標籤。例如:




< ref bean=”mySchool”/>

測試類:

    package com.bjpowernode.di01;

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


    public class MyTest {

        @Test
        public void test01() {
            // 建立容器物件,載入Spring配置檔案
            String resource = "com/bjpowernode/di01/applicationContext.xml";
            ApplicationContext ac = new ClassPathXmlApplicationContext(resource);
            Student student = (Student) ac.getBean("myStudent");
            System.out.println(student);
        }

    }

(2)構造注入
構造注入是指,在構造呼叫者例項的同時,完成被呼叫者的例項化。即,使用構造器設定依賴關係。

構造注入標籤中用於指定引數的屬性有:
name:指定引數名稱。
index:指明該引數對應著構造器的第幾個引數,從 0 開始。不過,該屬性不要也行, 但要注意,若引數型別相同,或之間有包含關係,則需要保證賦值順序要與構造器中的引數順序一致。另外,type 屬性可用於指定其型別。基本型別直接寫型別關鍵字即可,非基本型別需要寫全限定性類名。

構造注入和設值注入在配置檔案裡面會有一些不同。

package com.bjpowernode.di02;

public class Student {
    private String name;
    private int age;
    private School school;   // 物件屬性,域屬性

    public Student(String name, int age, School school) {
        super();
        this.name = name;
        this.age = age;
        this.school = school;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", school=" + school
                + "]";
    }
}

配置檔案:

<?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.xsd">

    <!-- 註冊School -->
    <bean id="mySchool" class="com.bjpowernode.di02.School">
        <property name="name" value="清華大學"/>
    </bean>

    <!-- 註冊Student -->
    <bean id="myStudent" class="com.bjpowernode.di02.Student">

        <constructor-arg name="name" value="李四"/>
        <constructor-arg name="age" value="24"/>
        <constructor-arg name="school" ref="mySchool"/>
        <!-- 
        <constructor-arg index="0" value="李四"/>
        <constructor-arg index="1" value="24"/>
        <constructor-arg index="2" ref="mySchool"/>
         -->
        <!--  
        <constructor-arg value="李四"/>
        <constructor-arg value="24"/>
        <constructor-arg ref="mySchool"/>
         -->
    </bean>

</beans>

注意,上面的index可要可不要。


補充:(在設值注入的基礎上進行的修改:)
對於設值注入與構造注入,在配置檔案中,除了使用或標籤外,還可使用名稱空間注入的方式,讓注入的值以標籤屬性的方式出現。根據注入實現方式的不同,分為p 名稱空間注入與c 名稱空間注入。
p 名稱空間注入:採用設值注入方式,故需要有相應的 setter
c 名稱空間注入:採用構造注入方式,故需要有相應的構造器

P名稱空間注入和C名稱空間注入是有點區別的:配置檔案上面的區別

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 註冊School -->
    <bean id="mySchool" class="com.bjpowernode.di03.School" p:name="北京大學"/>

    <!-- 註冊Student -->
    <bean id="myStudent" class="com.bjpowernode.di03.Student" 
            p:name="王五" p:age="25" p:school-ref="mySchool"/>

</beans>

C名稱空間注入:

<?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:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 註冊School -->
    <bean id="mySchool" class="com.bjpowernode.di04.School">
        <property name="name" value="清華大學"/>
    </bean>

    <!-- 註冊Student -->
    <bean id="myStudent" class="com.bjpowernode.di04.Student" 
            c:name="趙六" c:age="26" c:school-ref="mySchool"/>

</beans>