spring全家桶之springIOC篇 —— (5)、bean配置进阶篇

1、一个bean注入另外一个bean

当Person类中有一个属性是Car,那么该如何配置呢

  • Car类
package com.imooc.spring;

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 + "]";
    }
}
  • Person类
package com.imooc.spring;

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 + "]";
    }

}
  • 配置文件
    两种方式,一种是先创建一个全局的Car的bean,然后在Person bean中引入
    第二种是在Person bean中直接引入一个内部Car bean。
<bean id="car" class="com.imooc.spring.Car">
    <property name="brand" value="BMW"></property>
    <property name="price" value="100"></property>
</bean>

<!-- 引入外面创建的bean -->
<bean id="person1" class="com.imooc.spring.Person">
    <property name="name" value="小明"></property>
    <property name="car" ref="car"></property>
</bean>

<!-- 创建内部bean -->
<bean id="person2" class="com.imooc.spring.Person">
    <property name="name" value="小花"></property>
    <property name="car">
        <bean class="com.imooc.spring.Car">
            <property name="brand" value="BYD"></property>
            <property name="price" value="200"></property>
        </bean>
    </property>
</bean>

上面定义的全局的Car bean跟不同的bean没有什么区别,也是可以直接获取使用的,而Person2中定义的内部Car bean由于是个内部bean,所以只在Person1这个bean有效,不能想普通的bean在别的地方获取使用。

2、value中特殊符号的使用

如果value值有 < 这样子的特殊符号,将会出错,因为该符号在xml文件中是节点的起始
我们可以使用<![CDATA[value]]>来解决

    <bean id="car" class="com.imooc.spring.Car">
       <property name="brand">
        <value><![CDATA[<BMW>]]></value>
    </property>
        <property name="price" value="1111111"></property>
    </bean>

3、赋null值

<property name="name"><null/></property>

4、集合属性

假设一个person有好几辆Car

  • Person类
package com.imooc.spring;

import java.util.List;

public class Person {
    private String name;
    private int age;
    private List<Car> cars;

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

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

    public void setCars(List<Car> cars) {
        this.cars = cars;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", car=" + cars + "]";
    }

}
  • 配置bean
<bean id="car1" class="com.imooc.spring.Car">
    <property name="brand" value="BMW"></property>
    <property name="price" value="100"></property>
</bean>

<bean id="car2" class="com.imooc.spring.Car">
    <property name="brand" value="BYD"></property>
    <property name="price" value="200"></property>
</bean>

<!-- 引入外面创建的bean -->
<bean id="person1" class="com.imooc.spring.Person">
    <property name="name" value="小明"></property>
    <property name="cars">
        <list>
            <ref bean="car1" />
            <ref bean="car2" />
        </list>
    </property>
</bean>

<!-- 创建内部bean -->
<bean id="person2" class="com.imooc.spring.Person">
    <property name="name" value="小花"></property>
    <property name="cars">
        <list>
            <bean class="com.imooc.spring.Car">
                <property name="brand" value="BMW"></property>
                <property name="price" value="100"></property>
            </bean>

            <bean class="com.imooc.spring.Car">
                <property name="brand" value="BYD"></property>
                <property name="price" value="200"></property>
            </bean>
        </list>
    </property>
</bean>

-也是使用了两种方式,引用外部bean和内部直接创建bean
-同样的,除了使用list节点,也可以使用set节点和map节点
-map比较特殊一些,因为他是键值对的形式

map可以这样配置

<map>
    <entry key="bwm" value-ref="car1"></entry>
    <entry key="auti" value-ref="car2"></entry>
</map>

5、Properties类型属性配置

在配置数据库连接池的时候,需要配置properties,那么该如何配置这种类型的bean呢
先写一个DataSource类模拟一下

  • DataSource类
package com.imooc.spring;

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 + "]";
    }
}
  • 配置文件
<bean id="dataSource" class="com.imooc.spring.DataSource">
        <property name="properties">
            <props >
                <prop key="user">root</prop>
                <prop key="password">123456</prop>
                <prop key="jdbcUrl">jdbc:mysql://xxx</prop>
                <prop key="driverClass">com.mysql.jdbc.Driver</prop>
            </props>
        </property>
    </bean>
  • 测试类
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource ds = (DataSource) ctx.getBean("dataSource");
System.out.println(ds);
  • 输出结果
    这里写图片描述

6、配置独立的集合bean

上面的集合属性,都是引用一个一个单独的bean组合在一起的的。我们可以使用util:list来将多个bean几种在一起,然后一次性加入注入。

<!-- 需要 引入util命名空間 -->
<!-- 
<util:map id="cars">
     <entry key="bwm" value-ref="car1"></entry>
     <entry key="audi" value-ref="car2"></entry>
</util:map>
-->

<util:list id="cars">
    <ref bean="car1" />
    <ref bean="car2" />
</util:list>

<!-- 引入外面创建的bean -->
<bean id="person3" class="com.imooc.spring.Person">
    <property name="name" value="小明"></property>
    <property name="cars" ref="cars"></property>
</bean>

还有util:properties等,用法都差不多
注意,需要引入util命名空间
xmlns:util="http://www.springframework.org/schema/util"

7、使用p命名空间

p命名空间可以简化我们配置bean的过程,减少工作量
先导入p命名空间

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

<bean id="person4" class="com.imooc.spring.Person" p:name="小明" p:cars-ref="cars"></bean>

注意:普通的属性使用:p:name=”小明”
引用别的bean:p:cars-ref=”cars”

猜你喜欢

转载自blog.csdn.net/abc997995674/article/details/80271810