7.3 Spring Bean 注入集合
我们还可以在 Bean 标签下的 <property>
元素中,使用以下元素配置 Java 集合类型的属性和参数,例如 List、Set、Map 以及 Properties 等。
标签 | 说明 |
---|---|
<list> | 用于注入 list 类型的值,允许重复 |
<set> | 用于注入 set 类型的值,不允许重复 |
<map> | 用于注入 key-value 的集合,其中 key 和 value 都可以是任意类型 |
<props> | 用于注入 key-value 的集合,其中 key 和 value 都是字符串类型 |
1. 在集合中设置普通类型的值
例 1
下面我们通过一个实例,演示下如何注入集合类型的属性和参数。
创建命名为 CollectionBean 的类,代码如下:
package section3.demo1;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* ClassName: CollectionBean
* Description: TODO
*
* @author chuanlu
* @version 1.0.0
*/
public class CollectionBean {
//1 数组类型属性
private String[] strings;
//2 list 集合类型属性
private List<String> list;
//3 map 集合类型属性
private Map<String, String> maps;
//4 set 集合类型属性
private Set<String> sets;
public void setStrings(String[] strings) {
this.strings = strings;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
public void setSets(Set<String> sets) {
this.sets = sets;
}
@Override
public String toString() {
return "CollectionBean{" +
"strings=" + Arrays.toString(strings) +
", list=" + list +
", maps=" + maps +
", sets=" + sets +
'}';
}
}
修改 Spring 配置文件 spring-config.xml,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="collectionBean" class="section3.demo1.CollectionBean">
<!--数组类型-->
<property name="strings">
<array>
<value>Java</value>
<value>MySQL</value>
<value>Spring</value>
</array>
</property>
<!--List 类型-->
<property name="list">
<list>
<value>Java</value>
<value>MySQL</value>
<value>Spring</value>
</list>
</property>
<!--Map 类型-->
<property name="maps">
<map>
<entry key="Java" value="Java"/>
<entry key="MySQL" value="MySQL"/>
<entry key="Spring" value="Spring"/>
</map>
</property>
<!--Set 类型-->
<property name="sets">
<set>
<value>Java</value>
<value>MySQL</value>
<value>Spring</value>
</set>
</property>
</bean>
</beans>
创建命名为 MainApp 的类,代码如下:
package section3.demo1;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* ClassName: MainApp
* Description: TODO
*
* @author chuanlu
* @version 1.0.0
*/
public class MainApp {
private static final Log LOGGER = LogFactory.getLog(MainApp.class);
public static void main(String[] args) {
//获取 ApplicationContext 容器
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//获取名为 javaCollection 的 Bean
CollectionBean collectionBean = context.getBean("collectionBean", CollectionBean.class);
//日志输出对象信息
LOGGER.info(collectionBean.toString());
}
}
执行 MainApp 中的 main 方法,控制台输出如下:
4月 08, 2022 2:36:27 下午 section3.demo1.MainApp main
信息: CollectionBean{strings=[Java, MySQL, Spring], list=[Java, MySQL, Spring], maps={Java=Java, MySQL=MySQL, Spring=Spring}, sets=[Java, MySQL, Spring]}
2. 在集合中设置对象类型的值
例 2
在上面的示例中,都是在集合中通过 value 属性设置的普通类型的值,我们还可以通过 ref 属性在注入到 Bean 的集合中设置对象类型的值。
创建命名为 Course 的类,代码如下:
package section3.demo2;
/**
* ClassName: Course
* Description: TODO
*
* @author chuanlu
* @version 1.0.0
*/
public class Course {
// 课程编号
private Integer courseId;
// 课程名称
private String courseName;
public void setCourseId(Integer courseId) {
this.courseId = courseId;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
@Override
public String toString() {
return "Course{" +
"courseId=" + courseId +
", courseName='" + courseName + '\'' +
'}';
}
}
创建命名为 CollectionBean 的类,代码如下:
package section3.demo2;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* ClassName: CollectionBean
* Description: TODO
*
* @author chuanlu
* @version 1.0.0
*/
public class CollectionBean {
//1 数组类型属性
private Course[] courses;
//2 list 集合类型属性
private List<Course> courseList;
//3 map 集合类型属性
private Map<String, Course> courseMap;
//4 set 集合类型属性
private Set<Course> courseSet;
public void setCourses(Course[] courses) {
this.courses = courses;
}
public void setCourseList(List<Course> courseList) {
this.courseList = courseList;
}
public void setCourseMap(Map<String, Course> courseMap) {
this.courseMap = courseMap;
}
public void setCourseSet(Set<Course> courseSet) {
this.courseSet = courseSet;
}
@Override
public String toString() {
return "CollectionBean:{\n"
+ "\tcourses:" + Arrays.toString(courses) + ",\n"
+ "\tcourseList:" + Arrays.toString(courseList.toArray()) + ",\n"
+ "\tcourseMap:" + Arrays.toString(courseMap.values().toArray()) + ",\n"
+ "\tcourseSet:" + Arrays.toString(courseSet.toArray()) + ",\n"
+ "}";
}
}
修改 Spring 配置文件 spring-config.xml,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="course1" class="section3.demo2.Course">
<property name="courseId" value="1"/>
<property name="courseName" value="Java"/>
</bean>
<bean id="course2" class="section3.demo2.Course">
<property name="courseId" value="2"/>
<property name="courseName" value="MySQL"/>
</bean>
<bean id="course3" class="section3.demo2.Course">
<property name="courseId" value="3"/>
<property name="courseName" value="Spring"/>
</bean>
<bean id="collectionBean" class="section3.demo2.CollectionBean">
<!--数组类型-->
<property name="courses">
<array>
<ref bean="course1"/>
<ref bean="course2"/>
<ref bean="course3"/>
</array>
</property>
<!--List 类型-->
<property name="courseList">
<list>
<ref bean="course1"/>
<ref bean="course2"/>
<ref bean="course3"/>
</list>
</property>
<!--Map 类型-->
<property name="courseMap">
<map>
<entry key="Java" value-ref="course1"/>
<entry key="MySQL" value-ref="course2"/>
<entry key="Spring" value-ref="course3"/>
</map>
</property>
<!--Set 类型-->
<property name="courseSet">
<set>
<ref bean="course1"/>
<ref bean="course2"/>
<ref bean="course3"/>
</set>
</property>
</bean>
</beans>
创建命名为 MainApp 的类,代码如下:
package section3.demo2;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* ClassName: MainApp
* Description: TODO
*
* @author chuanlu
* @version 1.0.0
*/
public class MainApp {
private static final Log LOGGER = LogFactory.getLog(MainApp.class);
public static void main(String[] args) {
//获取 ApplicationContext 容器
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//获取名为 javaCollection 的 Bean
CollectionBean collectionBean = context.getBean("collectionBean", CollectionBean.class);
//日志输出对象信息
LOGGER.info(collectionBean.toString());
}
}
执行 MainApp 中的 main 方法,控制台输出如下:
4月 08, 2022 2:58:37 下午 section3.demo2.MainApp main
信息: CollectionBean:{
courses:[Course{courseId=1, courseName='Java'}, Course{courseId=2, courseName='MySQL'}, Course{courseId=3, courseName='Spring'}],
courseList:[Course{courseId=1, courseName='Java'}, Course{courseId=2, courseName='MySQL'}, Course{courseId=3, courseName='Spring'}],
courseMap:[Course{courseId=1, courseName='Java'}, Course{courseId=2, courseName='MySQL'}, Course{courseId=3, courseName='Spring'}],
courseSet:[Course{courseId=1, courseName='Java'}, Course{courseId=2, courseName='MySQL'}, Course{courseId=3, courseName='Spring'}],
}