Bean管理-注入属性(二)
大约 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>
可以在 property
标签中继续注册 Address
Bean。
运行测试类进行测试,输出结果如下:
User{name='guodongAndroid', age=18, address=Address{country='China', province='Shandong', city='Jining'}}
外部引用
内部注入的 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>
首先注册 Address
Bean,并设置一个唯一标识 id = "address"
,再注册 User
Bean,在使用 property
标签为 User
类中的 address
注入数据时,使用 ref
属性引用外部注册的 Bean。
运行测试类进行测试,输出结果如下:
User{name='guodongAndroid', age=18, address=Address{country='China', province='Shandong', city='Qingdao'}}
注入集合属性
下面学习如何注入 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>
分别使用 array
、list
、map
以及 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]}
外部引用
首先导入 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 和注入集合数据,主要分为:
- 内部注入,
- 外部引用注入。
笔者比较喜欢使用外部引用注入,利于维护和复用,但也不是一成不变的,视情况可以使用内部注入。