1. 程式人生 > >[Js-Spring]基於 XML 的 DI

[Js-Spring]基於 XML 的 DI

byname org ray height 必須 imp 其他 image sch

註入分類

(1)設值註入:先調用 Bean 的無參構造函數,然後通過 setter 方法傳入被調用者的實例。

<!-- bean definitions here -->
<bean id="mySchool" class="com.neu.di01.School">
    <property name="sname" value="neu"></property>
</bean>
<bean id="myStudent" class="com.neu.di01.Student">
    <property name="name"
value="js"></property> <property name="age" value="23"></property> <property name="school" ref="mySchool"></property> </bean>

註:對於其他 Bean 對象的引用,除了<bean/>標簽的 ref 屬性外,還可以使用 <ref/> 標簽

(2)構造註入:在構造調用者實例的同時,完成了被調用者的實例化。即使用構造器設置依賴關系

<constructor-arg> 標簽中用於指定參數的屬性:

name:指定參數名稱

index:指明該參數對應構造器的第幾個參數,從0開始,不過該屬性可以不需要,但是需要註意,若參數類型相同,或之間有包含關系,則需要保證賦值順序要與構造器中的參數順序一致

   另外,type屬性可用於指定類型,基本類型直接寫類型關鍵字即可,非基本類型需要寫全限定性類名

<!-- bean definitions here -->
<bean id="mySchool" class="com.neu.di02.School">
    <property name="sname" value="neu"></property>
</bean> <bean id="myStudent" class="com.neu.di02.Student"> <constructor-arg name="name" value="js"></constructor-arg> <constructor-arg name="age" value="22"></constructor-arg> <constructor-arg name="school" ref="mySchool"></constructor-arg> <!-- <constructor-arg value="js"></constructor-arg> <constructor-arg value="22"></constructor-arg> <constructor-arg ref="mySchool"></constructor-arg> --> <!-- <constructor-arg index="0" value="js"></constructor-arg> <constructor-arg index="1" value="22"></constructor-arg> <constructor-arg index="2" ref="mySchool"></constructor-arg> --> </bean>

(3)特定接口註入:采用了侵入式編程,汙染了代碼,幾乎不用

命名空間註入(了解)

對於設值註入和構造註入,除了使用 <property/>或<constructor-arg/>標簽外,還可以使用命名空間註入的方式,讓註入的值以<bean/>標簽屬性的方式出現。根據註入實現方式的不同,分別以 p 命名空間和 c 命名空間註入。

p 命名空間註入:采用設值註入,需要相應的 setter 方法

c 命名空間註入:采用構造註入,需要相應的構造器

(1)p 命名空間註入

采用約束

xmlns:p="http://www.springframework.org/schema/p"

<!-- bean definitions here -->
<bean id="mySchool" class="com.neu.di03.School" p:sname="北京大學"></bean>
<bean id="myStudent" class="com.neu.di03.Student" p:name="張三"
    p:age="22" p:school-ref="mySchool"></bean>

(2)c 命名空間註入

采用約束

xmlns:c="http://www.springframework.org/schema/c"

<!-- bean definitions here -->
<bean id="mySchool" class="com.neu.di04.School">
    <property name="sname" value="清華大學"></property>
</bean>
<bean id="myStudent" class="com.neu.di04.Student" c:name="張三"
    c:age="22" c:school-ref="mySchool"></bean>

集合屬性註入

分別為數組,List,Set,Map,Properties註入值,例子如下,

School.java

package com.neu.di05;

public class School {
    private String sname;

    public void setSname(String sname) {
        this.sname = sname;
    }

    @Override
    public String toString() {
        return "School [sname=" + sname + "]";
    }
}

Some.java

package com.neu.di05;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class Some {
    private School[] schools;
    private List<String> myList;
    private Set<String> mySet;
    private Map<String, Object> myMap;
    private Properties myPros;

    public void setSchools(School[] schools) {
        this.schools = schools;
    }

    public void setMyList(List<String> myList) {
        this.myList = myList;
    }

    public void setMySet(Set<String> mySet) {
        this.mySet = mySet;
    }

    public void setMyMap(Map<String, Object> myMap) {
        this.myMap = myMap;
    }

    public void setMyPros(Properties myPros) {
        this.myPros = myPros;
    }

    @Override
    public String toString() {
        return "Some [schools=" + Arrays.toString(schools) + ", myList=" + myList + ", mySet=" + mySet + ", myMap="
                + myMap + ", myPros=" + myPros + "]";
    }

}

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

    <!-- bean definitions here -->
    <bean id="school1" class="com.neu.di05.School">
        <property name="sname" value="清華大學"></property>
    </bean>
    <bean id="school2" class="com.neu.di05.School">
        <property name="sname" value="北京大學"></property>
    </bean>
    <bean id="some" class="com.neu.di05.Some">
        <property name="schools">
            <array>
                <ref bean="school1" />
                <ref bean="school2" />
            </array>
        </property>
        <property name="myList">
            <list>
                <value>張三</value>
                <value>李四</value>
            </list>
        </property>
        <property name="mySet">
            <set>
                <value>北京</value>
                <value>上海</value>
            </set>
        </property>
        <property name="myMap">
            <map>
                <entry key="QQ" value="123"></entry>
                <entry key="WeiXin" value="456"></entry>
            </map>
        </property>
        <property name="myPros">
            <props>
                <prop key="地址">遼寧省沈陽市</prop>
                <prop key="名稱">neu</prop>
            </props>
        </property>
    </bean>

</beans>

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

    <!-- bean definitions here -->
    <bean id="school1" class="com.neu.di06.School">
        <property name="sname" value="清華大學"></property>
    </bean>
    <bean id="school2" class="com.neu.di06.School">
        <property name="sname" value="北京大學"></property>
    </bean>
    <bean id="some" class="com.neu.di06.Some">
        <property name="schools">
            <array>
                <ref bean="school1" />
                <ref bean="school2" />
            </array>
        </property>
        <property name="arrays" value="aaa,bbb"></property>
        <property name="myList" value="張三s,李四"></property>
        <property name="mySet" value="北京,上海"></property>
        <property name="myMap">
            <map>
                <entry key="QQ" value="123"></entry>
                <entry key="WeiXin" value="456"></entry>
            </map>
        </property>
        <property name="myPros">
            <props>
                <prop key="地址">遼寧省沈陽市</prop>
                <prop key="名稱">neu</prop>
            </props>
        </property>
    </bean>

</beans>

MyTest.java

package com.neu.di05;

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

public class MyTest {

    @Test
    public void test01() {
        // 加載Spring配置文件,創建Spring容器對象
        String resource = "com/neu/di05/applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(resource);
        // 從容器中獲取指定的Bean對象
        Some some = (Some) ac.getBean("some");
        System.out.println(some);
        ((ClassPathXmlApplicationContext) ac).close();
    }
}

對於域屬性的自動註入

byName 方式自動註入

配置文件中被調用者的 Bean 的 id 值與代碼中調用者 Bean 的屬性名相同時,可以使用 byName 的方式,讓容器自動將被調用者 Bean 註入給調用者 Bean 。

技術分享圖片

技術分享圖片

如圖中 id 為 school 的 Bean,正好對應 Student 類中定義的 school 成員變量,在 id 為 myStudent 的 Bean 中直接定義自動註入方式 autowrite=“byName” 即可

byType 方式自動註入

配置文件中被調用者Bean的class屬性指定的類,必須要與代碼中被調用者Bean類的某域屬性同源,即,相同或者具有is-a關系(子類,或者實現類)。同源的被調用者Bean只能有一個,多於一個則會報錯,不知道該匹配哪一個。

技術分享圖片

[Js-Spring]基於 XML 的 DI