Spring4.0学习笔记003——Bean的配置一(基于XML文件)

1. bean属性的注入方式

1-1. 属性注入

上一篇文章,以如下的XML文件来配置bean信息。

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

    <!-- 配置bean -->
    <bean id="HelloWorld" class="com.yfyzwr.spring.beans.HelloWorld">
        <property name="name" value="World"></property>
    </bean>

</beans>

属性注入即是通过setter方法来注入Bean的属性值或依赖的对象。属性注入使用< property >元素, 使用name属性来指定Bean的属性名称,value 属性或< value >子节点来指定属性值。

属性注入是实际应用中最常用的注入方式

1-2. 构造器注入

通过构造方法注入Bean的属性值或依赖的对象,它能保证Bean实例在实例化后就可以使用。

构造器注入在< constructor-arg >节点里声明属性, < constructor-arg >节点没有name属性,直接指定value。

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

    <!-- 配置bean -->
    <bean id="HelloWorld" class="com.yfyzwr.spring.beans.HelloWorld">
        <constructor-arg value="World" index="0" type="java.lang.String"></constructor-arg>
    </bean>

</beans>

修改之后的XML配置文件使用的是构造器注入属性值的方式。

  • value:为该属性指定的初始值。
  • index:可选,指定该value将被赋予的属性的声明顺序(从0开始)。
  • type:可选,指定该value将被赋予的属性的类型。


配置某个bean类时包含n个< constructor-arg >节点,就要求改bean类的实现类必须有带n个参数的构造器函数。

2. 引用其他bean

组成应用程序的Bean经常需要相互协作以完成应用程序的功能,要使Bean能够相互访问, 就必须在Bean配置文件中指定对Bean的引用。

在Bean的配置文件中, 可以通过< ref >子节点或ref属性为Bean的属性或构造器参数指定对Bean的引用。

  1. 新建Car类。

    public class Car {
        private String brand;
        private double price;
    
        public void setBrand(String brand) {
            this.brand = brand;
        }
        public void setPrice(double price) {
            this.price = price;
        }
    
        @Override
        public String toString() {
            return "Car [brand=" + brand + ", price=" + price + "]";
        }
    
    }
  2. 新建Person类。

    public class Person {
        private String name;
        private int age;
        private Car car;
    
        public void setName(String name) {
            this.name = name;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public void setCar(Car car) {
            this.car = car;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
        }
    
    }
  3. 设置bean配置文件。

    <bean id="Car_id" class="com.yfyzwr.spring.beans.Car">
        <property name="brand" value="红旗"></property>
        <property name="price" value="123456.78"></property>
    </bean>
    
    <bean id="Person" class="com.yfyzwr.spring.beans.Person">
        <property name="name" value="金三胖"></property>
        <property name="age" value="30"></property>
        <property name="car" ref="Car_id"></property>
    </bean>
  4. 修改main方式的实现。

    ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
    Person person = (Person)context.getBean("Person");
    System.out.println(person.toString());
  5. 从输出结果可以得知,Person实例包含对Car实例的引用关系。

3. 配置集合属性

  1. 修改Person类的实现

    public class Person {
    
        private String name;
        private int age;
    
        private List<Integer> scores;
        private List<Car> carsList;
        private Set<Car> carsSet;
        private Map<String, Car> carsMap;
    
        public void setName(String name) {
            this.name = name;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public void setScores(List<Integer> scores) {
            this.scores = scores;
        }
        public void setCarsList(List<Car> carsList) {
            this.carsList = carsList;
        }
    
        public void setCarsSet(Set<Car> carsSet) {
            this.carsSet = carsSet;
        }
    
        public void setCarsMap(Map<String, Car> carsMap) {
            this.carsMap = carsMap;
        }
    
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + ", scores=" + scores + ", carsList=" + carsList + ", carsSet="
                    + carsSet + ", carsMap=" + carsMap + "]";
        }
    
    }
    
  2. 修改xml配置文件

        <bean id="Person" class="com.yfyzwr.spring.beans.Person">
            <property name="name" value="zhu"></property>
            <property name="age" value="21"></property>
    
            <!-- 配置List属性 -->
            <property name="scores">
                <list>
                    <value>100</value>
                    <value>93</value>
                    <value>97</value>
                </list>
            </property>
    
            <!-- 配置List属性 -->
            <property name="carsList">
                <list>
                    <ref bean="Car"/>
                    <ref bean="Car"/>
                    <ref bean="Car"/>
                </list>
            </property>
    
            <!-- 配置Set属性 -->
            <property name="carsSet">
                <set>
                    <ref bean="Car"/> <!-- Set没有重复元素,所以输出只要一个元素 -->
                    <ref bean="Car"/>
                    <ref bean="Car"/>
                </set>
            </property>
    
            <!-- 配置Map属性 -->
            <property name="carsMap">
                <map>
                    <entry key="son1" value-ref="Car"></entry>
                    <entry key="son2" value-ref="Car"></entry>
                    <entry key="son3" value-ref="Car"></entry>
                </map>
            </property>
        </bean>
  3. 运行程序,查看输出结果。

4. 使用P命名空间简化配置

  1. 在xml配置文件,点击右键,选择【Open With】->【Spring Config Editor】按钮,会出现下图所示的tab标签。
  2. 选择NameSpaces标签,勾选上其中的P命名空间,此时在xml配置文件中会多出如下语句。

    xmlns:p="http://www.springframework.org/schema/p"
  3. 上述的配置信息就可以改下为简化的形式。

    <bean id="Car_id" class="com.yfyzwr.spring.beans.Car"
        p:brand="红旗" p:price="123456.78"></bean>
    <bean id="Person" class="com.yfyzwr.spring.beans.Person"
        p:name="金三胖" p:age="30" p:car-ref="Car_id"></bean>
  4. 运行的结果与前述的一致。

你可能感兴趣的:(spring)