目录直通车

1、 本文实验环境

2、 bean与bean之间相互访问

3、配置集合属性 List

 4、 配置集合属性Map

5、 获取配置信息

6、 配置单例集合bean以供多个 bean 进行过引用


本文主要从bean的配置由繁到简。学习需要花费时间,这是笔者花费非常多的时间做出来的,静下心来阅读你会有大收获!有问题欢迎留言!

1、 本文实验环境

文件目录

springboot构造方法中怎么使用 spring构造方法注入bean_System

首先新建一个 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);


    }
}

得到以下结果

springboot构造方法中怎么使用 spring构造方法注入bean_spring_02

 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>

springboot构造方法中怎么使用 spring构造方法注入bean_List_03

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>