hualinux spring 3.6:依賴注入(XML文件方式)的幾種方式

目錄

一、普通測試

1.1 建立無參hello

1.1.1 建立配置文件

1.1.2 代碼

1.1.3 運行結果

1.1.4 總結

1.2 建立有參的hello

二、 屬性注入

2.1 get和set注入

2.2 ref引用

三、構造函數注入

3.1 默認

3.2使用index索引匹配入參

3.3 按類型匹配入參

3.4 問題 相同class

四、 其它

4.1字面值

4.2 內部bean

4.2.1 例子

4.3 null值和級聯屬性

4.4 集合屬性

4.5 集合屬性

4.6 使用 utility scheme 定義集合

4.7 使用p命名空間


上章《hualinux spring 3.4:idea 2020.1 創建簡單的spring》講了如果使用iidea創建spring項目,並寫了一個簡單的helloWorld,現在這裏基於這個項目講依賴注入。

一、普通測試

在測試之前我把《hualinux spring 3.4:idea 2020.1 創建簡單的spring》建立的java文件及xml配置文件全部刪除,恢復空項目

1.1 建立無參hello

1.1.1 建立配置文件

src右擊-->new-->XML Configuration File-->Spring config-->輸入名字“ApplicationContext” 

ApplicationContext.xml配置文件如下:

<!--配置bean-->
<bean id="hello" class="com.hualinux.beans.Hello">
    <property name="name" value="Spring"/>
</bean>

1.1.2 代碼

src-->com.hualinux.beans.Hello.java

package com.hualinux.beans;

public class Hello {
    String name;

    public void helloTest(){
        System.out.println("你好:"+name);
    }

    public void setName(String name) {
        this.name = name;
    }
}

src-->com.hualinux.beans.Main.java

package com.hualinux.beans;

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

public class Main {
    public static void main(String[] args) {
        //1. 創建 Spring 的 IOC 容器對象
        ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");

        //2. 從IOC容器中獲取Bean實例
        Hello hello= (Hello) ctx.getBean("hello");

        //3. 調用hello方法
        hello.helloTest();
    }
}

1.1.3 運行結果

運行一下,怎運行前一章已經講了,我這裏就不說了

1.1.4 總結

在spring的xml配置中:

idBean 的名稱

  • IOC 容器中必須是唯一的
  • id 沒有指定,Spring 自動將權限定性類名作爲 Bean 的名字
  • id 可以指定多個名字,名字之間可用逗號、分號、或空格分隔

Spring ApplicationContext 容器

Application Context spring 中較高級的容器。和 BeanFactory 類似,它可以加載配置文件中定義的 bean,將所有的 bean 集中在一起,當有請求的時候分配 bean 另外,它增加了企業所需要的功能,比如,從屬性文件中解析文本信息和將事件傳遞給所指定的監聽器。這個容器在 org.springframework.context.ApplicationContext interface 接口中定義。

ApplicationContext 包含 BeanFactory 所有的功能,一般情況下,相對於 BeanFactoryApplicationContext 會更加優秀。當然,BeanFactory 仍可以在輕量級應用中使用,比如移動設備或者基於 applet 的應用程序。

最常被使用的 ApplicationContext 接口實現:

  1. FileSystemXmlApplicationContext:該容器從 XML 文件中加載已被定義的 bean。在這裏,你需要提供給構造器 XML 文件的完整路徑。
  2. ClassPathXmlApplicationContext:該容器從 XML 文件中加載已被定義的 bean。在這裏,你不需要提供 XML 文件的完整路徑,只需正確配置 CLASSPATH 環境變量即可,因爲,容器會從 CLASSPATH 中搜索 bean 配置文件。
  3. WebXmlApplicationContext:該容器會在一個 web 應用程序的範圍內加載在 XML 文件中已被定義的 bean

1.2 建立有參的hello

如果修改爲有參的構造器得需要一個默認的無參構造器

//idea測試發現不加也行,但建議還是加上

複製Hello.java變成Hello2.java

public class Hello2 {
    String name;

    public void helloTest(){
        System.out.println("你好:"+name);
    }

    public Hello2() {
    }

    public Hello2(String name) {
        this.name = name;
    }
}

ApplicationContext.xml配置文件添加如下內容

    <!--配置bean-->
    <bean id="hello2" class="com.hualinux.beans.Hello2">
        <constructor-arg name="name" value="Spring2"/>
    </bean>

Main.java,修改如下:

package com.hualinux.beans;

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

public class Main {
    public static void main(String[] args) {
        //1. 創建 Spring 的 IOC 容器對象
        ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");

        //2. 從IOC容器中獲取Bean實例
        Hello hello= (Hello) ctx.getBean("hello");
        Hello2 hello2= (Hello2) ctx.getBean("hello2");

        //3. 調用hello方法
        hello.helloTest();
        hello2.helloTest();
    }
}

運行結果爲:

 

二、 屬性注入

2.1 get和set注入

屬性注入即通過 setter 方法注入Bean 的屬性值或依賴的對象

屬性注入使用 <property> 元素, 使用 name 屬性指定 Bean 的屬性名稱,value 屬性或 <value> 子節點指定屬性值

屬性注入是實際應用中最常用的注入方式

例子就是上面的無參hello

 

2.2 ref引用

  1. 組成應用程序的 Bean 經常需要相互協作以完成應用程序的功能. 要使 Bean 能夠相互訪問, 就必須在 Bean 配置文件中指定對 Bean 的引用
  2. 在 Bean 的配置文件中, 可以通過 <ref> 元素或 ref  屬性爲 Bean 的屬性或構造器參數指定對 Bean 的引用.
  3. 也可以在屬性或構造器裏包含 Bean 的聲明, 這樣的 Bean 稱爲內部 Bean

下面是一個配置例子,需要建立Car類,並有3個屬性;也需要建立Person類,3個屬性,其中一個包括car ,後面將貼出代碼

<bean id="car" class="com.hualinux.beans.Car">
    <constructor-arg value="BMW X6" />
    <constructor-arg value="進口寶馬" />
    <constructor-arg value="1000000" />
</bean>

<bean id="person" class="com.hualinux.beans.Person" >
    <property name="name" value="華" />
    <property name="age" value="20" />
    <property name="car" ref="car" />
</bean>

三、構造函數注入

通過構造方法注入Bean 的屬性值或依賴的對象,它保證了 Bean 實例在實例化後就可以使用。

構造器注入在 <constructor-arg> 元素裏聲明屬性, <constructor-arg> 中沒有 name 屬性

3.1 默認

例子1,上面的hello2

例子2:

src-->com.hualinux.beans.Car.java

package com.hualinux.beans;

public class Car {
    private String brand;
    private String corp;
    private float price;
    private int maxSpeed;


    //    先弄3個參數,最後一個不用
    public Car(String brand, String corp, float price) {
        this.brand = brand;
        this.corp = corp;
        this.price= price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", corp='" + corp + '\'' +
                ", price=" + price +
                ", maxSpeed=" + maxSpeed +
                '}';
    }

}

ApplicationContext.xml配置文件

<!--通過構造方法來配置 bean的屬性-->
<!--爲了方便先弄三個參數的-->
<bean id="car" class="com.hualinux.beans.Car">
    <constructor-arg value="BMW X6" />
    <constructor-arg value="進口寶馬" />
    <constructor-arg value="1000000"/>
</bean>

Main.java

package com.hualinux.beans;

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

public class Main {
    public static void main(String[] args) {
        //1. 創建 Spring 的 IOC 容器對象
        ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");

        //2. 從IOC容器中獲取Bean實例
        Hello hello= (Hello) ctx.getBean("hello");
        Hello2 hello2= (Hello2) ctx.getBean("hello2");
        Car car= (Car) ctx.getBean("car");
        System.out.println(car.toString());

        //3. 調用hello方法
        hello.helloTest();
        hello2.helloTest();
    }
}

運行結果爲: 

 

3.2使用index索引匹配入參

ApplicationContext.xml配置文件中id爲car的修改爲如下:

<!--索引方式-->
<bean id="car" class="com.hualinux.beans.Car">
    <constructor-arg value="BMW X6" index="0" />
    <constructor-arg value="進口寶馬" index="1" />
    <constructor-arg value="1000000" index="2"/>
</bean>

再次運行Main.java,結果如下:

 

3.3 按類型匹配入參

ApplicationContext.xml配置文件中id爲car的修改爲如下:

<bean id="car" class="com.hualinux.beans.Car">
    <constructor-arg value="BMW X6" type="java.lang.String"/>
    <constructor-arg value="進口寶馬" type="java.lang.String" />
    <constructor-arg value="1000000" type="float"/>
</bean>

運行Main.java 結果也是相同的

 

3.4 問題 相同class

src-->com.hualinux.beans.Car.java 建立多一個構造函數

    
    //  不使用第3個屬性
    public Car(String brand, String corp, int maxSpeed) {
        this.brand = brand;
        this.corp = corp;
        this.maxSpeed = maxSpeed;
    }

ApplicationContext.xml配置文件中添加:

<bean id="car2" class="com.hualinux.beans.Car">
    <constructor-arg value="法拉利" />
    <constructor-arg value="進口" />
    <constructor-arg value="320" />
</bean>

這樣纔有2個car了

    <bean id="car2" class="com.hualinux.beans.Car">
        <constructor-arg value="法拉利" />
        <constructor-arg value="進口" />
        <constructor-arg value="320" />
    </bean>

    <bean id="car" class="com.hualinux.beans.Car">
        <constructor-arg value="BMW X6" type="java.lang.String"/>
        <constructor-arg value="進口寶馬" type="java.lang.String" />
        <constructor-arg value="1000000" type="float"/>
    </bean>

Main添加多一個car2,總代碼如下:

package com.hualinux.beans;

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

public class Main {
    public static void main(String[] args) {
        //1. 創建 Spring 的 IOC 容器對象
        ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");

        //2. 從IOC容器中獲取Bean實例
        Hello hello= (Hello) ctx.getBean("hello");
        Hello2 hello2= (Hello2) ctx.getBean("hello2");
        Car car= (Car) ctx.getBean("car");
        System.out.println(car.toString());
        
        Car car2= (Car) ctx.getBean("car2");
        System.out.println(car2.toString());

        //3. 調用hello方法
        hello.helloTest();
        hello2.helloTest();
    }
}

結果:320是時速即變成了價格吧

解決方法:

指定type匹配類型也行(因爲2個構造函數,用的是重載)

注:用index固定好參數順序是不行的

<!-- 使用構造器注入值可以指定參數的位置和參數類型!以區分重載構造器!-->
<bean id="car2" class="com.hualinux.beans.Car">
    <constructor-arg value="法拉利" type="java.lang.String" />
    <constructor-arg value="進口" type="java.lang.String" />
    <constructor-arg value="320" type="int"/>
</bean>

再次運行發現正常了,如下圖所示:

 

四、 其它

4.1字面值

  1. 字面值:可用字符串表示的值,可以通過 <value> 元素標籤或 value 屬性進行注入。
  2. 基本數據類型及其封裝類、String 等類型都可以採取字面值注入的方式
  3. 若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起來

 

4.2 內部bean

  1. 當 Bean 實例僅僅給一個特定的屬性使用時, 可以將其聲明爲內部 Bean. 內部 Bean 聲明直接包含在 <property> 或 <constructor-arg> 元素裏, 不需要設置任何 id 或 name 屬性
  2. 內部 Bean 不能使用在任何其他地方

4.2.1 例子

src-->com.hualinux.beans.Person.java

package com.hualinux.beans;

public class Person {
    private String name;
    private int age;
    private Car car;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public Person() {
    }

    public Person(String name, int age, Car car) {
        this.name = name;
        this.age = age;
        this.car = car;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", car=" + car +
                '}';
    }
}

ApplicationContext.xml配置文件中添加:

<!-- 內部bean,不能補外部引用,只能內部使用 -->
<bean id="person" class="com.hualinux.beans.Person" >
    <property name="name" value="華" />
    <property name="age" value="20" />
    <property name="car">
        <bean id="car3" class="com.hualinux.beans.Car">
            <constructor-arg value="慕尚" />
            <constructor-arg value="進口賓利" />
            <constructor-arg value="305" type="int" />
        </bean>
    </property>
</bean>

Main.java中添加如下配置

        //在Main中添加
        Person person= (Person) ctx.getBean("person");
        System.out.println(person.toString());

運行結果爲:

 

4.3 null值和級聯屬性

  1. 可以使用專用的 <null/> 元素標籤爲 Bean 的字符串或其它對象類型的屬性注入 null 值
  2. 和 Struts、Hiberante 等框架一樣,Spring 支持級聯屬性的配置

ApplicationContext.xml配置文件中添加:

<bean id="person2" class="com.hualinux.beans.Person" >
    <property name="name" value="華2" />
    <property name="age" value="20" />
    <!-- 測試賦值null -->
    <property name="car" ><null/></property>
</bean>

<bean id="person2" class="com.hualinux.beans.Person" >
    <constructor-arg value="華2" />
    <constructor-arg value="20" />
    <!-- 測試賦值null -->
    <constructor-arg ><null/></constructor-arg>
</bean>

Main.jva添加

 Person person2= (Person) ctx.getBean("person2");
 System.out.println(person2.toString());

運行結果:

 

級聯屬性賦值:

修改ApplicationContext.xml配置文件中的person2

爲了方便我在Car.java中添加了getter和setter方法

<bean id="person2" class="com.hualinux.beans.Person" >
    <constructor-arg value="華2" />
    <constructor-arg value="20" />
    <!-- 測試賦值null -->
    <!--<constructor-arg ><null/></constructor-arg>-->

    <!-- 級聯屬性賦值。注意:屬性需要先初始化纔可以爲級聯屬性賦值,否則會有異常,和struts2不同-->
    <constructor-arg ref="car"/>
    <!-- Car類中的maxSpeed要添加setter方法,否則不生效-->
    <property name="car.maxSpeed" value="250"/>
</bean>

4.4 集合屬性

  1. 在 Spring中可以通過一組內置的 xml 標籤(例如: <list>, <set> 或 <map>) 來配置集合屬性.
  2. 配置 java.util.List 類型的屬性, 需要指定 <list>  標籤, 在標籤裏包含一些元素. 這些標籤可以通過 <value> 指定簡單的常量值, 通過 <ref> 指定對其他 Bean 的引用. 通過<bean> 指定內置 Bean 定義. 通過 <null/> 指定空元素. 甚至可以內嵌其他集合.
  3. 數組的定義和 List 一樣, 都使用 <list>
  4. 配置 java.util.Set 需要使用 <set> 標籤, 定義元素的方法與 List 一樣.

 

src-->com.hualinux.beans.collection.Car.java(和src-->com.hualinux.beans.Car.java一樣)

package com.hualinux.beans.collection;

public class Car {
    private String brand;
    private String corp;
    private float price;
    private int maxSpeed;


    //    先弄3個參數,最後一個不用
    public Car(String brand, String corp, float price) {
        this.brand = brand;
        this.corp = corp;
        this.price= price;
    }

    //  不使用第3個屬性
    public Car(String brand, String corp, int maxSpeed) {
        this.brand = brand;
        this.corp = corp;
        this.maxSpeed = maxSpeed;
    }


    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", corp='" + corp + '\'' +
                ", price=" + price +
                ", maxSpeed=" + maxSpeed +
                '}';
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getCorp() {
        return corp;
    }

    public void setCorp(String corp) {
        this.corp = corp;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public int getMaxSpeed() {
        return maxSpeed;
    }

    public void setMaxSpeed(int maxSpeed) {
        this.maxSpeed = maxSpeed;
    }
}

src-->com.hualinux.beans.collection.Person.java如下:

package com.hualinux.beans.collection;

import java.util.List;

public class Person {
    private String name;
    private int age;
    private List<com.hualinux.beans.collection.Car> car;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<com.hualinux.beans.collection.Car> getCar() {
        return car;
    }

    public void setCar(List<com.hualinux.beans.collection.Car> car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", car=" + car +
                '}';
    }
}

src右擊-->new-->XML Configuration File-->Spring config-->輸入名字“collection“

<bean id="car" class="com.hualinux.beans.collection.Car">
    <constructor-arg value="BMW X6" />
    <constructor-arg value="進口寶馬" />
    <constructor-arg value="1000000" />
</bean>

<!-- 使用構造器注入值可以指定參數的位置和參數類型!以區分重載構造器!-->
<bean id="car2" class="com.hualinux.beans.collection.Car">
    <constructor-arg value="法拉利" index="0" />
    <constructor-arg value="進口" index="1" />
    <constructor-arg value="320" index="2" />
</bean>

<bean id="car3" class="com.hualinux.beans.collection.Car">
    <constructor-arg value="911" type="java.lang.String" />
    <constructor-arg value="進口保時捷" type="java.lang.String" />
    <constructor-arg value="340" type="int" />
</bean>


<bean id="person3" class="com.hualinux.beans.collection.Person">
    <property name="name" value="Mike"/>
    <property name="age" value="27"/>
    <property name="car">
        <list>
            <ref bean="car" />
            <ref bean="car2" />
            <ref bean="car3" />
        </list>
    </property>
</bean>

src-->com.hualinux.beans.collection.Main.java

package com.hualinux.beans.collection.com.hualinux.beans.collection;

import com.hualinux.beans.collection.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("collection.xml");
        // 這裏的Person爲com.hualinux.beans.collection.Person
        Person person= (Person) ctx.getBean("person3");
        System.out.println(person.toString());

    }
}

運行結果:

Person{name='Mike', age=27, car=[Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}, Car{brand='911', corp='進口保時捷', price=0.0, maxSpeed=340}]}

 

4.5 集合屬性

  • Java.util.Map 通過 <map> 標籤定義, <map> 標籤裏可以使用多個 <entry> 作爲子標籤. 每個條目包含一個鍵和一個值.
  • 必須在 <key> 標籤裏定義鍵
  • 因爲鍵和值的類型沒有限制, 所以可以自由地爲它們指定 <value>, <ref>, <bean> 或 <null> 元素.
  • 可以將 Map 的鍵和值作爲 <entry> 的屬性定義: 簡單常量使用 key 和 value 來定義; Bean 引用通過 key-ref 和 value-ref 屬性定義
  • 使用 <props> 定義 java.util.Properties, 該標籤使用多個 <prop> 作爲子標籤. 每個 <prop> 標籤必須定義 key 屬性.

 

src-->com.hualinux.beans.collection.MapPerson.java

package com.hualinux.beans.collection;

import java.util.Map;

public class MapPerson {
    private String name;
    private int age;
    private Map<String,Car> cars;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Map<String, Car> getCars() {
        return cars;
    }

    public void setCars(Map<String, Car> cars) {
        this.cars = cars;
    }

    @Override
    public String toString() {
        return "MapPerson{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", cars=" + cars +
                '}';
    }

}

collection.xml配置文件中添加如下內容

<!-- 配置Map屬性值 -->
<bean id="mapPerson" class="com.hualinux.beans.collection.MapPerson">
    <property name="name" value="Rose" />
    <property name="age" value="28" />
    <property name="cars">
        <!-- 使用map節點及map的entry子節點配置Map類型成員變更-->
        <map>
            <entry key="AA" value-ref="car"/>
            <entry key="BB" value-ref="car2" />
        </map>
    </property>
</bean>

com.hualinux.beans.collection.Main.java是main中添加

    MapPerson mapPerson= (MapPerson) ctx.getBean("mapPerson");
    System.out.println(mapPerson);

運行結果如下:

Person{name='Mike', age=27, car=[Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}, Car{brand='911', corp='進口保時捷', price=0.0, maxSpeed=340}]}
MapPerson{name='Rose', age=28, cars={AA=Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, BB=Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}}}

例2 模擬數據庫配置連接

src-->com.hualinux.beans.collection.DataSource.java

package com.hualinux.beans.collection;

import java.util.Properties;

public class DataSource {
    private Properties properties;

    public Properties getProperties() {
        return properties;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    @Override
    public String toString() {
        return "DataSource{" +
                "properties=" + properties +
                '}';
    }

}

collection.xml配置文件中添加

<!-- 配置 Properties 屬性值 -->
<bean id="dataSource" class="com.hualinux.beans.collection.DataSource">
    <property name="properties">
        <!-- 使用 props 和 prop 子節點來爲 properties 屬性賦值-->
        <props>
            <prop key="user">root</prop>
            <prop key="password">root</prop>
            <prop key="jdbcUrl">jdbc:mysql://test</prop>
            <prop key="driverClass">com.mysql.jdbc.Driver</prop>
        </props>
    </property>
</bean>

com.hualinux.beans.collection.Main.java,的main中添加,如下代碼:

DataSource dataSource= (DataSource) ctx.getBean("dataSource");
System.out.println(dataSource.getProperties());

運行結果:

Person{name='Mike', age=27, car=[Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}, Car{brand='911', corp='進口保時捷', price=0.0, maxSpeed=340}]}
MapPerson{name='Rose', age=28, cars={AA=Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, BB=Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}}}
{password=root, driverClass=com.mysql.jdbc.Driver, jdbcUrl=jdbc:mysql://test, user=root}

4.6 使用 utility scheme 定義集合

  • 使用基本的集合標籤定義集合時, 不能將集合作爲獨立的 Bean 定義, 導致其他 Bean 無法引用該集合, 所以無法在不同 Bean 之間共享集合.
  • 可以使用 util schema 裏的集合標籤定義獨立的集合 Bean. 需要注意的是, 必須在 <beans> 根元素裏添加 util schema 定義

collection.xml配置文件中添加

<!-- 配置單例集合bean,以供多個bean進行引用,需要導入util 命名空間-->
<util:list id="cars">
    <ref bean="car" />
    <ref bean="car2" />
</util:list>

<bean id="person4" class="com.hualinux.beans.collection.Person">
    <property name="name" value="Jack"/>
    <property name="age" value="29"/>
    <property name="car" ref="cars"/>
</bean>

list會提示到不到,點一下按Alt+Enter

這後就顯示正常了 

 

4.7 使用p命名空間

  • 爲了簡化 XML 文件的配置,越來越多的 XML 文件採用屬性而非子元素配置信息。
  • Spring 從 2.5 版本開始引入了一個新的 p 命名空間,可以通過 <bean> 元素屬性的方式配置 Bean 的屬性。
  • 使用 p 命名空間後,基於 XML 的配置方式將進一步簡化

collection.xml配置文件中添加

<!-- 通過p命名空間爲bean的屬性賦值,需要先導入p命名空間。相於於傳統配置方式更加簡潔 -->
<bean id="person5" class="com.hualinux.beans.collection.Person"
      p:name="Queen" p:car-ref="cars" />

 上面p是紅色的話用Alt+Enter就會自動爲配置添加相關的關聯,這樣p命名空間就可以使用了。

com.hualinux.beans.collection.Main.java,的main中添加,如下代碼:

        Person person5= (Person) ctx.getBean("person5");
        System.out.println(person5.toString());

運行結果爲:

Person{name='Mike', age=27, car=[Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}, Car{brand='911', corp='進口保時捷', price=0.0, maxSpeed=340}]}
MapPerson{name='Rose', age=28, cars={AA=Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, BB=Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}}}
{password=root, driverClass=com.mysql.jdbc.Driver, jdbcUrl=jdbc:mysql://test, user=root}
Person{name='Queen', age=0, car=[Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}]}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章