跳至主要內容

Bean管理-注入属性(二)

guodongAndroid大约 3 分钟

前言

上一篇文章 中,我们学习了为 User 类注入简单的属性,今天笔者学习下注入复杂的属性。

环境配置

首先创建一个 Address 类,并在 User 类中新增一个 address 属性:

package bean;

public class Address {

    private String country;

    private String province;

    private String city;

    // 省略 getter/setter/toString 方法
    ..........
}
package bean;

public class User {

    private String name;

    private int age;
    
    private Address address;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 省略 getter/setter/toString 方法
    ..........
}

注入Bean

内部注入

接下来修改 spring.xml 配置文件:

<bean class="bean.User" id="user" c:name="guodongAndroid" c:age="18">
    <property name="address">
        <bean class="bean.Address">
            <property name="country" value="China"/>
            <property name="province" value="Shandong"/>
            <property name="city" value="Jining"/>
        </bean>
    </property>
</bean>

modify-spring-config-internal-bean

可以在 property 标签中继续注册 Address Bean

运行测试类进行测试,输出结果如下:

User{name='guodongAndroid', age=18, address=Address{country='China', province='Shandong', city='Jining'}}

spring-config-internal-bean-result

外部引用

内部注入的 Address 其他 Bean 不能使用,只能在 User 中使用,不利于多次复用,所以我们可以把 Address 抽取出来供其他 Bean 使用:

<bean class="bean.Address" id="address">
    <property name="country" value="China"/>
    <property name="province" value="Shandong"/>
    <property name="city" value="Qingdao"/>
</bean>

<bean class="bean.User" id="user" c:name="guodongAndroid" c:age="18">
    <property name="address" ref="address"/>
</bean>

modify-spring-config-external-bean

首先注册 Address Bean,并设置一个唯一标识 id = "address",再注册 User Bean,在使用 property 标签为 User 类中的 address 注入数据时,使用 ref 属性引用外部注册的 Bean

运行测试类进行测试,输出结果如下:

User{name='guodongAndroid', age=18, address=Address{country='China', province='Shandong', city='Qingdao'}}

spring-config-external-bean-result

注入集合属性

下面学习如何注入 Array、List、Map、Set 等集合数据,新建 Collection 类:

public class Collection {

    private String[] strArray;

    private List<String> strList;

    private Map<String, String> strMap;

    private Set<String> strSet;
    
    // 省略 getter/setter/toString 方法
    ..........
}

内部注入

spring.xml 配置文件中注册 Bean 并为它注册属性:

<bean class="bean.Collection" id="collection">
    <property name="strArray">
        <array>
            <value>1</value>
            <value>2</value>
            <value>3</value>
        </array>
    </property>
    <property name="strList">
        <list>
            <value>4</value>
            <value>5</value>
            <value>6</value>
        </list>
    </property>
    <property name="strMap">
        <map>
            <entry key="7" value="7"/>
            <entry key="8" value="8"/>
            <entry key="9" value="9"/>
        </map>
    </property>
    <property name="strSet">
        <set>
            <value>10</value>
            <value>11</value>
            <value>12</value>
        </set>
    </property>
</bean>

mofidy-spring-config-collection

分别使用 arraylistmap 以及 set 标签为 Array、List、Map、Set 集合属性注入数据。

因为我们注册了一个新的 Bean,所以测试类中的代码需要修改:

public class SpringTest {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

        /*User user = context.getBean("user", User.class);
        System.out.println(user);*/

        Collection collection = context.getBean(Collection.class);
        System.out.println(collection);
    }

}

注释掉对 User 类的获取输出,新增对 Collection 类的获取输出,运行测试代码,输出结果如下:

Collection{strArray=[1, 2, 3], strList=[4, 5, 6], strMap={7=7, 8=8, 9=9}, strSet=[10, 11, 12]}

mofidy-spring-config-collection-result

外部引用

首先导入 util 命名空间:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
+      xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
+      http://www.springframework.org/schema/util
+      https://www.springframework.org/schema/util/spring-util.xsd">
</beans>

抽取集合属性:

+ <util:list id="strList">
+     <value>4</value>
+     <value>5</value>
+     <value>6</value>
+ </util:list>

<bean class="bean.Collection" id="collection">
    <property name="strArray">
        <array>
            <value>1</value>
            <value>2</value>
            <value>3</value>
        </array>
    </property>
-   <property name="strList">
-       <list>
-           <value>4</value>
-           <value>5</value>
-           <value>6</value>
-       </list>
-   </property>
+   <property name="strList" ref="strList" />
    <property name="strMap">
        <map>
            <entry key="7" value="7"/>
            <entry key="8" value="8"/>
            <entry key="9" value="9"/>
        </map>
    </property>
    <property name="strSet">
        <set>
            <value>10</value>
            <value>11</value>
            <value>12</value>
        </set>
    </property>
</bean>

使用 ref 属性引用外部的集合数据。

运行测试类输出结果相同。

总结

本文学习了通过配置文件为 Bean 注入其他 Bean 和注入集合数据,主要分为:

  1. 内部注入,
  2. 外部引用注入。

笔者比较喜欢使用外部引用注入,利于维护和复用,但也不是一成不变的,视情况可以使用内部注入。

今日学习记录open in new window