上篇我们了解了一下applicationContext.xml的两种注入方式,本篇我们来了解一下关于属性的注入以及操作。
在敲代码的过程中,我们很容易遇到这样的问题,比如一个List的集合,我之前给他赋值两个,现在我想给他再重新赋值,一般的想法当然是修改代码,然后完成自己想要的需求了,但是这种做法是不可取了,所以我们完成可以采用Spring属性注入的方式来解决此问题。看如下demo:
1、我们创建一个类,来创建几个不同类型的属性:
常用属性的注入有:int,String,list,set,map等。
Bean01属性类:
public class Bean01 {
private String strValue; //String类型实体
private int intValue; //int类型实体<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
private List listValue; //list类型实体
private Set setValue; //Set类型实体
private String[] arrayValue; //String集合实体
private Map mapValue; //Map集合实体
private Date dateValue; //date类型实体
…………省略get,set方法
}
由于有了set方法,所以我们完全可以采用setter注入的方式对其属性赋值
applicationContext.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" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="bean01" class="com.bjpowernode.spring.Bean01">
<property name="strValue" value="Hello_Spring" />
<property name="intValue" value="123" />
<property name="listValue">
<list>
<value>list1</value>
<value>list2</value>
</list>
</property>
<property name="setValue">
<set>
<value>set1</value>
<value>set2</value>
</set>
</property>
<property name="arrayValue">
<set>
<value>array1</value>
<value>array2</value>
</set>
</property>
<property name="mapValue">
<map>
<entry key="k1" value="v1"></entry>
<entry key="k2" value="v2"></entry>
</map>
</property>
<property name="dateValue" value="2011-10-21"> //日期格式赋值
</property>
</bean>
</beans>
但是有好多信息并非是简简单单的赋值就能够满足需求的,比如我们的日期,存有各种格式,到界面会存在乱码或者格式显示的问题,相关日期乱码博客Laydate日期乱码。我们该如何去应如自如呢?当然,对于这种情况,我们完全可以单独罗列出来,新建一个类来完成我们的需求,对于这个类的作用,我们称其为“属性编辑器”。
- 继承PropertyEditorSupport
- 覆盖setAsText()方法
- 将自定义的属性编辑器注入到spring中
创建UtilDatePropertyEditor类:
// 继承于Java beans的PropertyEditorSupport来实现我们的功能。
public class UtilDatePropertyEditor extends PropertyEditorSupport {
// 定义一个实体,获得set方法
private String pattern;
// 获得的set方法,便于注入
public void setPattern(String pattern) {
this.pattern = pattern;
}
// 覆盖方法setAsText满足需求
@Override
public void setAsText(String text) throws IllegalArgumentException {
// 输出来,便于测试显示结果
System.out.println("---UtilDatePropertyEditor.setAsText()---" + text);
try {
// 只适用于一种格式
Date date = new SimpleDateFormat(pattern).parse(text);
// 将其赋值进去
this.setValue(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 异常抛出
throw new IllegalArgumentException(text);
}
}
}
由于Spring是支持多文件配置的,就和文件一样,每个文件都干着不一样的事,所以我们可以再新建一个配置applicationContext-editor.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" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!-- 注:ID不能和之前的配置文件重复 --><!-- 将属性编辑器注入给Spring,Class为CustomEditorConfigurer的路径 -->
<bean id="customEditors"
class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<!--将属性编辑器放进CustomEditorConfigurer的成员变量customEditors中进行保存,通过setter方式注入 -->
<property name="customEditors">
<map>
<!--key值为要转换的类型 -->
<entry key="java.util.Date">
<!--内部转换器 -->
<bean class="com.bjpowernode.spring.UtilDatePropertyEditor">
<!--通过setter的方式注入对pattern(多个日期的选择)的设置 -->
<property name="pattern" value="yyyy-MM-dd"></property>
</bean>
</entry>
</map>
</property>
</bean>
<!--转换器 -->
<!--注:这个转换器到底是私有还是共有,放在外边则是大家都可以使用,我们可以选择放在里边 -->
<!-- <bean id="utilDatePropertyEditor" class="com.bjpowernode.spring.UtilDatePropertyEditor"></bean> -->
</beans>
这样我们的关于日期的一个属性编辑器就完工了,不管是pattern,日期类型的注入还是整个编辑器的注入,整个过程都采用的setter的注入方式,最后我们使用单元测试的方式测试一下:
public class InjectionTest extends TestCase {
// 定义成员变量
private BeanFactory factory;
@Override
protected void setUp() throws Exception {
// 只创建一次对配置文件的读取
/*
* factory = new
* ClassPathXmlApplicationContext("applicationContext.xml");
*/
// 传递数组,两个配置文件的读取
String[] configLocations = new String[] { "applicationContext.xml",
"applicationContext-editor.xml" };
factory = new ClassPathXmlApplicationContext(configLocations);
}
@Override
protected void tearDown() throws Exception {
// 销毁,删除的方法
}
public void testInjection1() {
Bean01 bean01 = (Bean01) factory.getBean("bean01");
System.out.println("bean01.strValue=" + bean01.getStrValue());
System.out.println("bean01.intValue=" + bean01.getIntValue());
System.out.println("bean01.listValue=" + bean01.getListValue());
System.out.println("bean01.setValue=" + bean01.getSetValue());
System.out.println("bean01.arrayValue=" + bean01.getArrayValue());
System.out.println("bean01.mapValue=" + bean01.getMapValue());
System.out.println("bean01.dateValue=" + bean01.getDateValue());
}
最后的结果:
总结:
1、通过spring的BeanFactory实例化,配置和管理对象,当有多个对象的时候,其实除了数组的方式来管理,我们还可以采取规范化的管理方式,在配置文件定义名字的时候,我们可以规定为统一的格式,比如上述例子的两个文件,我们可以修改名称为:“applicationContext-beans.xml”、“applicationContext-editor.xml”
这样我们则可以简单化调用:
factory = new ClassPathXmlApplicationContext("applicationContext-*.xml");