Spring IOC 复杂类型的注入方式

 前面我们已经讲解了简单类型的注入方式,现在让我们来看看复杂类型的注入方式。

 首先看看我们需要用到的 bean

public class Book {
    private String name;
    private String author;

    // getter/setter...
    // toString()...
}
public class Car {
    private String name;
    private String color;
    private Double price;

    // getter/setter...
    // toString()...
}
public class Person {

    private String name;

    private String gender;

    private Integer age;

    private String email;

    private Car car;

    private List<Book> bookList;

    private Map<String, Object> map;

    private Properties properties;

    // getter/setter...
    // toString()...
}
注入对象

 现在,我想要一辆车,我们该如何在person中注入 car 的属性呢?

    <bean id="car01" class="spring.bean.Car">
        <property name="name" value="宝马"></property>
        <property name="color" value="红色"></property>
        <property name="price" value="300000"></property>
    </bean>
   
<bean id="person01" class="spring.bean.Person">
        <property name="gender" >
            <null></null>
        </property>
        <property name="car" ref="car01"></property>
    </bean>
  • ref:表示引入外部属性

 我们在 ioc 容器中注册两个组件,然后 在 Person 组件中引用 Car 组件。现在,让我们考虑这样一个问题:我修改 Person 组件中的 Car 的属性,会不会造成 Car 组件中的属性改变呢?

    @Test
    public void test() {
        Person person01 = (Person) context.getBean("person01");
        Car car01 = (Car) context.getBean("car01");
        System.out.println(car01);
        person01.getCar().setName("永久");

        System.out.println(car01);
     }

Car{name=‘宝马’, color=‘红色’, price=300000.0}

Car{name=‘永久’, color=‘红色’, price=300000.0}

 我们看到,当我们修改 Person 中的 car 的属性的时候,ioc 容器中的 car 也会发生变化(真是一夜回到解放前啊)。

 想要获取car,我们也可以这样写:

    <bean id="person01" class="spring.bean.Person">
        <property name="gender" >
            <null></null>
        </property>
        <property name="car">
            <bean class="spring.bean.Car">
                <property name="name" value="宝马"></property>
                <property name="color" value="红色"></property>
                <property name="price" value="300000"></property>
            </bean>
        </property>
    </bean>

 这样我们就不怕 ioc 容器中的 car 被修改啦

注入集合
注入 list 集合
    <bean id="book01" class="spring.bean.Book">
        <property name="name" value="三国演义"></property>
        <property name="author" value="罗贯中"></property>
    </bean>    

    <bean id="person02" class="spring.bean.Person">
        <property name="bookList">
            <list>
                <bean class="spring.bean.Book" p:name="西游记" p:author="吴承恩"></bean>
                <!--引用一个外部对象-->
                <ref bean="book01"></ref>
            </list>
        </property>
    </bean>

 这里,我们使用了 list 标签为 bookList 赋值。在 list 里面,我们又用两种方法给 book赋值,一种方法时使用 p 名称空间,还有一种方法是通过 ref 标签引入一个外部对象。

注入 map 集合
    <bean id="person03" class="me.crw.spring.bean.Person">
        <property name="map">
            <map>
                <entry key="name" value="张三"></entry>
                <entry key="age" value="18"></entry>
                <entry key="books" value-ref="book01"></entry>
                <entry key="car">
                    <bean class="me.crw.spring.bean.Car">
                        <property name="name" value="宝马"></property>
                    </bean>
                </entry>
                <entry key="array">
                    <array>
                        <value type="int">1</value>
                        <value type="int">2</value>
                        <value type="int">3</value>
                    </array>
                </entry>
            </map>
        </property>
    </bean>

 这里,我们使用了 map 标签为 map赋值。在 map 里面,我们用 entry 来给键值对赋值。这个键可以是普通类型,也可以是对象,也可以是集合。

注入 Property
    <bean id="person04" class="spring.bean.Person">
        <property name="properties">
            <props>
                <prop key="username">root</prop>
                <prop key="password">123456</prop>
            </props>
        </property>
    </bean>

 在这里,我们使用了 标签表明我们要为 property 类型的属性赋值,在标签中,我们用 来为具体的属性赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值