IOC容器-Bean管理 集合类型属性注入
之前的案例都是基本类型注入,下面演示Array、Set、Map、List如何做属性注入
- 创建类,包含Array、Set、Map、List类型成员
- 配置XML文档
创建测试类
package com.xjy.spring.collectType;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.TestConstructor;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class CollectTypeDemo {
private String[] Array;
private List<String> List;
private Map<String,String> stringMap;
private Set<String> stringSet;
public void setArray(String[] array) {
Array = array;
}
public void setList(java.util.List<String> list) {
List = list;
}
public void setStringMap(Map<String, String> stringMap) {
this.stringMap = stringMap;
}
public void setStringSet(Set<String> stringSet) {
this.stringSet = stringSet;
}
public void testFun(){
System.out.println(Array.toString());
System.out.println(List);
System.out.print(stringMap);
System.out.println(stringSet);
}
}
配置XML
<!--IOC-集合类型属性注入-->
<!--创建类对象-->
<bean id="collectTypeDemo" class="com.xjy.spring.collectType.CollectTypeDemo">
<!--数组使用<array>标签嵌套<value>标签 <list>标签也可以-->
<property name="array">
<array>
<value>Array数据1</value>
<value>Array数据2</value>
<value>Array数据3</value>
</array>
</property>
<!--List使用<list>标签嵌套<value>标签-->
<property name="list">
<list>
<value>List数据1</value>
<value>List数据2</value>
<value>List数据3</value>
</list>
</property>
<!--map类型使用<map>标签嵌套<entry>标签,并使用entry标签的key属性和value属性分别为key和value注入属性值-->
<property name="stringMap">
<map>
<entry key="JAVA" value="java"></entry>
<entry key="PYTHON" value="python"></entry>
<entry key="SWIFT" value="swift"></entry>
</map>
</property>
<!--Set使用<set>标签嵌套<value>标签-->
<property name="stringSet">
<set>
<value>Set数据1</value>
<value>Set数据2</value>
<value>Set数据3</value>
</set>
</property>
</bean>
详细用法
- Set、List、Array属性注入方式基本一致。都是用标签
- Map方法因为同时包含Key和Value值,需要单独的entry标签并使用包含的key属性和value属性设置值
编写测试代码
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("SpringConfig.xml");
CollectTypeDemo collect =
context.getBean("collectTypeDemo",CollectTypeDemo.class);
collect.testFun();
}
输出:
[Array数据1, Array数据2, Array数据3]
[List数据1, List数据2, List数据3]
{JAVA=java, PYTHON=python, SWIFT=swift}
[Set数据1, Set数据2, Set数据3]
进程已结束,退出代码0
进阶的用法
当集合类型为对象时,如何注入
上面的方法注入的类型都是基本类型集合,下面将演示如何对对象集合进行属性注入
示例
创建一个courses集合类,集合类型为一个自定义类Course
Course中包含一个String cName成员变量和对应的set方法
实现类
这里直接在上面的类中添加一个成员变量
//声明变量
private List<Course> courses;
//set方法
public void setCourses(java.util.List<Course> courses) {
this.courses = courses;
}
配置XML文件
首先创建两个用于测试的Course类对象
<!--对象集合类型参数测试-->
<bean id="course1" class="com.xjy.spring.collectType.Course">
<property name="cName" value="math"></property>
</bean>
<bean id="course2" class="com.xjy.spring.collectType.Course">
<property name="cName" value="Java"></property>
</bean>
编写集合类属性注入
<property name="courses">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
采用外部Bean引用方式使用ref标签将属性值引入
- ref bean:对象集合类型的对象标签
测试输出
[Array数据1, Array数据2, Array数据3]
[List数据1, List数据2, List数据3]
{JAVA=java, PYTHON=python, SWIFT=swift}
[Set数据1, Set数据2, Set数据3]
[Course{cName='math'}, Course{cName='Java'}]
进程已结束,退出代码0
提取类型注入方法
下面演示如何将集合类型属性注入方法提取出来以便重复使用
步骤
- 创建Book类,内包含一个List类型成员变量
- 配置XML文件公共方法为Book类对象赋值
实现类
Book类
package com.xjy.spring.collectType;
import java.util.List;
public class Book {
List<String> bookName;
public void setBookName(List<String> bookName) {
this.bookName = bookName;
}
@Override
public String toString() {
return "Book{" +
"bookName=" + bookName +
'}';
}
}
配置XML
若要提取方法,可使用util标签创建标签空间
先将util标签引入
在xml头部插入
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation=""内插入
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
引入util后编写公共注入方法
<util:list id="BookList">
<value>Java</value>
<value>Swift</value>
<value>Python</value>
</util:list>
创建Book类对象并使用util定义的BookList空间
<bean id="collectBook" class="com.xjy.spring.collectType.Book">
<property name="bookName" ref="BookList"></property>
</bean>
测试输出
Book{bookName=[Java, Swift, Python]}
进程已结束,退出代码0