Spring構造器的注入與配置bean的細節

目錄直通車

1、 本文實驗環境

2、 bean與bean之間相互訪問

3、配置集合屬性 List

 4、 配置集合屬性Map

5、 獲取配置信息

6、 配置單例集合bean以供多個 bean 進行過引用


本文主要從bean的配置由繁到簡。學習需要花費時間,這是筆者花費非常多的時間做出來的,靜下心來閱讀你會有大收穫!有問題歡迎留言!

1、 本文實驗環境

文件目錄

首先新建一個 TestConstructor 的bean。

public class TestConstructor {
    /**
     * 一個汽車的例子
     */
    private String brand;
    private String province;
    private double price;
    private int maxSpeed;

    public TestConstructor(String brand, String province, double price) {
        super();
        this.brand = brand;
        this.province = province;
        this.price = price;
    }

    public TestConstructor(String brand, double price, int maxSpeed) {
        super();
        this.brand = brand;
        this.price = price;
        this.maxSpeed = maxSpeed;
    }

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


}

在 constructorContext.xml 中添加以下代碼對構造器注入

 <!-- 構造器注入 -->
    <bean id="testConstructor1" class="com.spring.beans.ConstructorInject.TestConstructor">
        <constructor-arg name="brand" value="Audi"> </constructor-arg>
        <constructor-arg name="province" value="Beijing"> </constructor-arg>
        <constructor-arg name="price" value="300000" type="double"> </constructor-arg>
    </bean>
    <!-- 根據XML的語法,若需要帶符號需要加上<![CDATA[]]>,如:<![CDATA[<Shanghai>]]> -->
    <bean id="testConstructor2" class="com.spring.beans.ConstructorInject.TestConstructor">
        <constructor-arg name="brand" value="BaoMa" type="java.lang.String"> </constructor-arg>
        <constructor-arg name="price" value="300000" type="double"> </constructor-arg>
        <constructor-arg name="maxSpeed" value="200" type="int"> </constructor-arg>
    </bean>

2、 bean與bean之間相互訪問

新建一個名爲Person的 bean

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

    public Person() {
    }

    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 TestConstructor getCar() {
        return car;
    }

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

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

組成應用程序的Bean 經常需要相互協作來完成應用程序的功能,所以要使得Bean能夠相互訪問,就必須在配置文件中指定對Bean的應用。通過ref元素爲bean的屬性或構造器參數指定對Bean的引用。有以下三種寫法:

1)

<property name="car" ref="testConstructor2"> </property>

2)

<property name="car">
      <ref bean="testConstructor2"/>
</property>


3)內部bean(可給bean賦值),但不能用外部bean使用,只能內部使用。

<property name="car">
            <bean class="com.spring.beans.ConstructorInject.TestConstructor">
                <constructor-arg name="brand" value="Ford"> </constructor-arg>
                <constructor-arg name="price" value="200000"> </constructor-arg>
                <constructor-arg name="maxSpeed" value="200"> </constructor-arg>
            </bean>
            <!-- 將car賦值爲null,下面是null的轉悠標記 -->
            <!--<null/>-->
        </property>

3、配置集合屬性 List

新建一個名爲PersonList的bean

import java.util.List;

public class PersonList {
    private String name;
    private int age ;

    private List<TestConstructor> car;

    public PersonList() {
    }

    @Override
    public String toString() {
        return "PersonList{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", 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<TestConstructor> getCar() {
        return car;
    }

    public void setCar(List<TestConstructor> car) {
        this.car = car;
    }
}

在xml文件中配置上面剛剛添加的這個bean。

<bean id="personList" class="com.spring.beans.ConstructorInject.PersonList">
        <property name="name" value="DJun"> </property>
        <property name="age" value="22"> </property>
        <property name="car">
            <list>
                <ref bean="testConstructor2"/>
                <ref bean="testConstructor1"/>
            </list>
        </property>
    </bean>

在Application執行類中添加代碼


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

public class Application {
    public static void main(String[] args) {
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("com/spring/beans/ConstructorInject/ConstructorContext.xml");
        Person person = (Person)applicationContext.getBean("person");
        System.out.println("----- Person ------\n"+person);

        PersonList personList = (PersonList) applicationContext.getBean("personList");
        System.out.println("----- PersonList ------\n"+personList);


    }
}

得到以下結果

 4、 配置集合屬性Map

新建一個PersonMap

import java.util.Map;

public class PersonMap {
    private  String name;
    private  int age ;
    private Map<String,TestConstructor> car;

    public PersonMap() {
    }

    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, TestConstructor> getCar() {
        return car;
    }

    public void setCar(Map<String, TestConstructor> car) {
        this.car = car;
    }

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

xml 添加如下代碼配置bean

<!-- 配置集合屬性 Map -->
    <bean id="personMap" class="com.spring.beans.ConstructorInject.PersonMap">
        <property name="name" value="DJun"> </property>
        <property name="age" value="22"> </property>
        <property name="car">
            <map>
                <entry key="AA" value-ref="testConstructor1"> </entry>
                <entry key="BB" value-ref="testConstructor2"> </entry>
            </map>
        </property>
    </bean>

在Application中添加

  PersonMap personMap = (PersonMap) applicationContext.getBean("personMap");
        System.out.println("----- PersonMap ------\n"+personMap);

5、 獲取配置信息

新建DataSource的bean


import java.util.Properties;

public class DataSource {
    private Properties properties;

    public Properties getProperties() {
        return properties;
    }

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

    public DataSource() {
    }

    @Override
    public String toString() {
        return "DataSource{" +
                "properties=" + properties +
                '}';
    }
}
<!-- 通過props和prop 子節點來對properties來進行賦值 -->
    <bean id="dataSource" class="com.spring.beans.ConstructorInject.DataSource">
       <property name="properties">
           <props>
               <prop key="username">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>

6、 配置單例集合bean以供多個 bean 進行過引用

其實運行完了上面的實例之後,發現每次都在使用testConstructor1和testConstructor2,單個bean使用的話,還沒有多大的感覺。但是如果像我上面那樣去寫就非常的臃腫。

請看下面這個解決方案:

在xml中添加以下內容

 <util:list id="cars">
        <ref bean="testConstructor1"/>
        <ref bean="testConstructor2"/>
    </util:list>
    <bean id="singleList" class="com.spring.beans.ConstructorInject.PersonList">
        <property name="name" value="DJun"/>
        <property name="age" value="22"/>
        <property name="car" ref="cars"/>
    </bean>
    <!-- 通過 p 爲bean 賦值 -->
    <bean id="personP" class="com.spring.beans.ConstructorInject.Person"
          p:name="DJun"
          p:age="22"
          p:car-ref="testConstructor1"/>

完整的Application代碼:


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

public class Application {
    public static void main(String[] args) {
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("com/spring/beans/ConstructorInject/ConstructorContext.xml");
        Person person = (Person)applicationContext.getBean("person");
        System.out.println("----- Person ------\n"+person);

        PersonList personList = (PersonList) applicationContext.getBean("personList");
        System.out.println("----- PersonList ------\n"+personList);

        PersonMap personMap = (PersonMap) applicationContext.getBean("personMap");
        System.out.println("----- PersonMap ------\n"+personMap);

        DataSource dataSource = (DataSource) applicationContext.getBean("dataSource");
        System.out.println("---------DataSource ----------\n "+dataSource);

        PersonList personList1 = (PersonList) applicationContext.getBean("singleList");
        System.out.println("------- PersonList -------\n" + personList1);

        Person personP = (Person) applicationContext.getBean("personP");
        System.out.println("------- personP -------\n" + personP);
    }
}

完整的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:util="http://www.springframework.org/schema/util"
       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 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- 構造器注入 -->
    <bean id="testConstructor1" class="com.spring.beans.ConstructorInject.TestConstructor">
        <constructor-arg name="brand" value="Audi"> </constructor-arg>
        <constructor-arg name="province" value="Beijing"> </constructor-arg>
        <constructor-arg name="price" value="300000" type="double"> </constructor-arg>
    </bean>
    <!-- 根據XML的語法,若需要帶符號需要加上<![CDATA[]]>,如:<![CDATA[<Shanghai>]]> -->
    <bean id="testConstructor2" class="com.spring.beans.ConstructorInject.TestConstructor">
        <constructor-arg name="brand" value="BaoMa" type="java.lang.String"> </constructor-arg>
        <constructor-arg name="price" value="300000" type="double"> </constructor-arg>
        <constructor-arg name="maxSpeed" value="200" type="int"> </constructor-arg>
    </bean>
    <!-- 屬性配置細節 -->
    <bean id="person" class="com.spring.beans.ConstructorInject.Person">
        <property name="name" value="DJun"> </property>
        <property name="age" value="22"> </property>
        <!--
        組成應用程序的Bean 經常需要相互協作來完成應用程序的功能,
        所以要使得Bean能夠相互訪問,就必須在配置文件中指定對Bean的應用。
        通過ref元素爲bean的屬性或構造器參數指定對Bean的引用。
        有以下三種寫法:
        -->
        <!-- 1. -->
        <!--<property name="car" ref="testConstructor2"> </property>-->
        <!-- 2. -->
        <!--<property name="car">-->
            <!--<ref bean="testConstructor2"/>-->
        <!--</property>-->
        <!-- 3.內部bean(可給bean賦值),但不能用外部bean使用,只能內部使用 -->
        <property name="car">
            <bean class="com.spring.beans.ConstructorInject.TestConstructor">
                <constructor-arg name="brand" value="Ford"> </constructor-arg>
                <constructor-arg name="price" value="200000"> </constructor-arg>
                <constructor-arg name="maxSpeed" value="200"> </constructor-arg>
            </bean>
            <!-- 將car賦值爲null,下面是null的轉悠標記 -->
            <!--<null/>-->
        </property>
        <!-- 級聯屬性 -->
        <!--<property name="car.brand" value="300000"> </property>-->
    </bean>
    <!-- 配置集合屬性 List -->
    <bean id="personList" class="com.spring.beans.ConstructorInject.PersonList">
        <property name="name" value="DJun"> </property>
        <property name="age" value="22"> </property>
        <property name="car">
            <list>
                <ref bean="testConstructor2"/>
                <ref bean="testConstructor1"/>
            </list>
        </property>
    </bean>

    <!-- 配置集合屬性 Map -->
    <bean id="personMap" class="com.spring.beans.ConstructorInject.PersonMap">
        <property name="name" value="DJun"> </property>
        <property name="age" value="22"> </property>
        <property name="car">
            <map>
                <entry key="AA" value-ref="testConstructor1"> </entry>
                <entry key="BB" value-ref="testConstructor2"> </entry>
            </map>
        </property>
    </bean>
    <!-- 通過props和prop 子節點來對properties來進行賦值 -->
    <bean id="dataSource" class="com.spring.beans.ConstructorInject.DataSource">
       <property name="properties">
           <props>
               <prop key="username">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>
    <!--
       配置單例集合bean,以供多個 bean 進行過引用
   -->
    <util:list id="cars">
        <ref bean="testConstructor1"/>
        <ref bean="testConstructor2"/>
    </util:list>
    <bean id="singleList" class="com.spring.beans.ConstructorInject.PersonList">
        <property name="name" value="DJun"/>
        <property name="age" value="22"/>
        <property name="car" ref="cars"/>
    </bean>
    <!-- 通過 p 爲bean 賦值 -->
    <bean id="personP" class="com.spring.beans.ConstructorInject.Person"
          p:name="DJun"
          p:age="22"
          p:car-ref="testConstructor1"/>

</beans>

 

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