【Spring入门 】7.注入集合、其他类型的属性
文章目录
Spring注入集合
可在Bean标签下的元素中,使用以下元素配置Java集合类型的属性和参数:
标签 | 说明 |
---|---|
用于注入 list 类型的值,允许重复 | |
用于注入 set 类型的值,不允许重复 | |
用于注入 key-value 的集合,其中 key 和 value 都可以是任意类型 | |
用于注入 key-value 的集合,其中 key 和 value 都是字符串类型 |
1.在集合中设置普通类型的值(使用value属性)
package org.demo3;import java.util.Arrays;import java.util.List;import java.util.Map;import java.util.Set;public class JavaCollection { //数组类型 private String[] courses; //list集合类型 private List<String> list; //map集合类型 private Map<String,String> maps; //set集合类型 private Set<String> sets; @Override public String toString() { return "JavaCollection{" + "courses=" + Arrays.toString(courses) + ", list=" + list + ", maps=" + maps + ", sets=" + sets + '}'; } public void setCourses(String[] courses) { this.courses = courses; } 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; }}
package org.demo3;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp { private static final Log LOGGER= LogFactory.getLog(MainApp.class); public static void main(String[] args) { //获取ApplicationContext容器 ApplicationContext context=new ClassPathXmlApplicationContext("demo3beans.xml"); //获取名为JavaCollection的Bean JavaCollection javaCollection=context.getBean("javaCollection",JavaCollection.class); LOGGER.info(javaCollection.toString()); }}
<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-3.0.xsd"> <bean id="javaCollection" class="org.demo3.JavaCollection"> <property name="courses"> <array> <value>Java</value> <value>PHP</value> <value>C语言</value> </array> </property> <property name="list"> <list> <value>张三</value> <value>李四</value> <value>王五</value> </list> </property> <property name="maps"> <map> <entry key="JAVA" value="java"></entry> <entry key="PHP" value="php"></entry> </map> </property> <property name="sets"> <set> <value>JAVA</value> <value>PHP</value> </set> </property> </bean></beans>
2.在集合中设置对象类型的值(使用ref属性)
package org.demo3;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class Course { //private static final Log LOGGER = LogFactory.getLog(Course.class); //课程编号 private String courseId; //课程名称 private String courseName; public String getCourseId() { return courseId; } public String getCourseName() { return courseName; } public void setCourseId(String courseId) { this.courseId = courseId; } public void setCourseName(String courseName) { this.courseName = courseName; } @Override public String toString() { return "Course{" + "courseId=" + courseId + ", courseName='" + courseName + '\'' + '}'; }}
package org.demo3;import java.util.Arrays;import java.util.List;import java.util.Map;import java.util.Set;public class JavaCollection { //数组类型 //普通类型 private String[] courses; //对象类型 private Course[] courses1; public void setCourses1(Course[] courses1) { this.courses1 = courses1; } //list集合类型String private List<String> list; //map集合类型 private Map<String,String> maps; //set集合类型 private Set<String> sets; @Override public String toString() { return "JavaCollection{" + "courses(普通类型)=" + Arrays.toString(courses) + ", courses1(对象类型)=" + Arrays.toString(courses1) + ", list=" + list + ", maps=" + maps + ", sets=" + sets + '}'; } public void setCourses(String[] courses) { this.courses = courses; } 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; }}
package org.demo3;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp { private static final Log LOGGER= LogFactory.getLog(MainApp.class); public static void main(String[] args) { //获取ApplicationContext容器 ApplicationContext context=new ClassPathXmlApplicationContext("demo3beans.xml"); //获取名为JavaCollection的Bean 集合中设置普通类型值 JavaCollection javaCollection=context.getBean("javaCollection",JavaCollection.class ); //获取名为colloection的Bean 集合中设置对象类型值 JavaCollection colloection=context.getBean("colloection",JavaCollection.class); LOGGER.info(javaCollection.toString()); LOGGER.info(colloection.toString()); }}
<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-3.0.xsd"> <bean id="javaCollection" class="org.demo3.JavaCollection"> <property name="courses"> <array> <value>Java</value> <value>PHP</value> <value>C语言</value> </array> </property> <property name="list"> <list> <value>张三</value> <value>李四</value> <value>王五</value> </list> </property> <property name="maps"> <map> <entry key="JAVA" value="java"></entry> <entry key="PHP" value="php"></entry> </map> </property> <property name="sets"> <set> <value>JAVA</value> <value>PHP</value> </set> </property> </bean> <bean id="course1" class="org.demo3.Course"> <property name="courseId" value="1"/> <property name="courseName" value="Java"/> </bean> <bean id="course2" class="org.demo3.Course"> <property name="courseId" value="2"/> <property name="courseName" value="PHP"/> </bean> <bean id="course3" class="org.demo3.Course"> <property name="courseId" value="3"/> <property name="courseName" value="C"/> </bean> <bean id="colloection" class="org.demo3.JavaCollection"> <property name="courses1"> <array> <ref bean="course1"/> <ref bean="course2"/> <ref bean="course3"/> </array> </property> <property name="list"> <list> <value>张三</value> <value>李四</value> <value>王五</value> <value>赵六</value> </list> </property> <property name="maps"> <map> <entry key="JAVA" value="java"></entry> <entry key="PHP" value="php"></entry> </map> </property> <property name="sets"> <set> <value>MySQL</value> <value>Redis</value> </set> </property> </bean></beans>
Spring注入其他类型的属性
1.注入Null值
可以再XML配置文件中,通过元素将Null值注入到Bean中.
2.注入空字符串
在value属性值中空参数会当做空字符串处理
3.注入字面量
XML 配置中“”、“&”等特殊字符是不能直接保存的,否则 XML 语法检查时就会报错可以通过两种方式将包含特殊符号的属性注入 Bean 中。
①转义
特殊符号转义字符:
特殊字符 | 转义字符 |
---|---|
& | & ; |
< | < ; |
> | > ; |
" | " ; |
' | &apos ; |
在转义过程中,需要注意以下几点:
- 转义序列字符之间不能有空格
- 转义序列必须以“;”结束
- 单独出现的“&”不会被认为是转义的开始
- 区分大小写
②使用短字符串
通过短字符串 将包含特殊符号的属性值包裹起来,可以让 XML 解析器忽略对其中内容的解析,以属性原本的样子注入到 Bean 中。
使用短字符串 需要注意以下几点:
- 此部分不能再包含”]]>”;
- 不允许嵌套使用;
- “]]>”中不能包含空格或者换行。
4.级联属性赋值
可以再的子元素中,为它所依赖的Bean属性进行赋值,这就是"级联属性赋值"
使用级联属性赋值时,需要注意以下 3点:
- Java 类中必须有 setter 方法;
- Java 类中必须有无参构造器(默认存在);
- 依赖其他 Bean 的类中,必须提供一个它依赖的 Bean 的 getXxx() 方法。
示例
package org.demo4;public class ExamBean { //null值 private String propertyNull; //空字符串 private String propertyEmpty; //包含特殊符号的字面量 private String propertyLiteral; //使用短字符串转义特殊符号 private String propertyCDATA; //依赖的Bean(对象属性) private DependBean dependBean; //使用级联属性赋值时,需要提供一个依赖对象的getter方法 public DependBean getDependBean() { return dependBean; } public void setPropertyCDATA(String propertyCDATA) { this.propertyCDATA = propertyCDATA; } public void setDependBean(DependBean dependBean) { this.dependBean = dependBean; } @Override public String toString() { return "ExamBean{" + "propertyNull='" + propertyNull + '\'' + ", propertyEmpty='" + propertyEmpty + '\'' + ", propertyLiteral='" + propertyLiteral + '\'' + ", propertyCDATA='" + propertyCDATA + '\'' + ", dependBean=" + dependBean + '}'; } public void setPropertyNull(String propertyNull) { this.propertyNull = propertyNull; } public void setPropertyEmpty(String propertyEmpty) { this.propertyEmpty = propertyEmpty; } public void setPropertyLiteral(String propertyLiteral) { this.propertyLiteral = propertyLiteral; }}
package org.demo4;/ * 级联 依赖 */public class DependBean { private String dependProperty; public void setDependProperty(String dependProperty) { this.dependProperty = dependProperty; } @Override public String toString() { return "DependBean{" + "dependProperty='" + dependProperty + '\'' + '}'; }}
package org.demo4;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp { private static final Log LOGGER= LogFactory.getLog(MainApp.class); public static void main(String[] args) { //创建bean工厂 ApplicationContext context=new ClassPathXmlApplicationContext("demo4beans.xml"); ExamBean exam=context.getBean("exampleBean",ExamBean.class); LOGGER.info(exam.toString()); }}
<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-3.0.xsd"> <bean id="exampleBean" class="org.demo4.ExamBean"> <property name="propertyNull"> <null/> </property> <property name="propertyEmpty" value=""/> <property name="propertyLiteral" value="<span class="token entity named-entity" title="<bdqn">>"/> <!--使用 注入包含特殊符号的字面量--> <property name="propertyCDATA"> <value><![CDATA[]]></value> </property> <property name="dependBean" ref="dependBean"></property> <property name="dependBean.dependProperty" value="级联属性赋值"></property> </bean> <bean id="dependBean" class="org.demo4.DependBean"> <property name="dependProperty" value="依赖 Bean 内部赋值"></property> </bean></beans>