这一章我们来学习依赖关系的一点补充内容,公共属性的注入,自定义属性编辑器
我们现在来设想一种情况如果有多个bean的有相同的属性,我们每个bean都要做一次配置有时候是很麻烦呢,有没有针对公共属性进行注入的配置方法呢
下面我们通过一个小程序演示如何来对对公共属性的注入
我们这里定义两个Bean类分别为ExampleBean1.java和ExampleBean2.java,它们有两个公共属性name,sex
ExampleBean1.java
public class ExampleBean1 {
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
ExampleBean2.java
public class ExampleBean2 {
private String name;
private String sex;
private String addr;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
配置文件bean.xml
<bean id="abstractBean" abstract="true">
<property name="name" value="Zhangxx"/>
<property name="sex" value="Man"/>
</bean>
<bean id="ExampleBean1" class="cn.com.spring.injection.bean.ExampleBean1" parent="abstractBean">
</bean>
<bean id="ExampleBean2" class="cn.com.spring.injection.bean.ExampleBean2" parent="abstractBean">
<property name="name" value="Lixx" />
<property name="addr" value="shenzhen"/>
</bean>
测试程序
public class TestUtils extends TestCase {
private ApplicationContext actx = new FileSystemXmlApplicationContext("bean.xml");
@Test
public void test1(){
ExampleBean1 exbean = (ExampleBean1)actx.getBean("ExampleBean1");
ExampleBean2 exbean2 = (ExampleBean2)actx.getBean("ExampleBean2");
System.out.println(exbean.getName());
System.out.println(exbean.getSex());
System.out.println(exbean2.getName());
System.out.println(exbean2.getSex());
System.out.println(exbean2.getAddr());
}
}
运行结果
Zhangxx
Man
Lixx
Man
shenzhen
大家注意配置文件的书写,两点
1.公共属性的描述
通过<bean>标签定义公共属性属性,指定<bean>的属性abstract=true
2.具有相同属性的类在<bean>标签中指定其parent属性
这里大家可能也注意到子bean的属性定义会覆盖掉父类所定义的值,有点类似java中抽象类和子类的关系
下面我们来学习第二块内容自定义属性编辑器,Spring在进行依赖注入的时候可以将普通属性注入进来,但是有时候我们会遇到一些不能被Spring直接识别的类型,开发中经常会碰到的就是Date类型,这时可以通过Spring的属性编辑器把配置文件中的字符串转化成相应的对象进行注入。Spring已经有内置的属性编辑器,我们也可以根据需求自己编写一个属性编辑器
自定属性编辑器两个步骤
1.定义一个属性编辑器必须继承java.beans.PropertyEditorSupport
2.在配置文件配置上我们定义的属性编辑器
下面我们还是用一个小程序来演示如何编写自定义属性编辑器
我们将上面的类修改如下:
public class ExampleBean {
private String name;
private String sex;
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
自定义编辑器DatePropertyEditor.java
public class DatePropertyEditor extends PropertyEditorSupport {
private String format;
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
try{
this.setValue(dateFormat.parse(text));
}catch(Exception e){
e.printStackTrace();
}
}
}
配置文件
<bean id="ExampleBean" class="cn.com.spring.injection.bean.ExampleBean">
<property name="name" value="Lixx" />
<property name="sex" value="Man" />
<!-- 可以按照常规方式进行注入 ,容器将会自动转化成对应类型-->
<property name="birthday" value="1990-01-25"/>
</bean>
<bean id="dateFormat" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.util.Date">
<bean class="cn.com.spring.injection.bean.DatePropertyEditor">
<property name="format" value="yyyy-MM-dd" />
</bean>
</entry>
</map>
</property>
</bean>
测试程序
public class TestUtils extends TestCase {
private ApplicationContext actx = new FileSystemXmlApplicationContext("bean.xml");
@Test
public void test1(){
ExampleBean exbean = (ExampleBean)actx.getBean("ExampleBean");
System.out.println(exbean.getName());
System.out.println(exbean.getSex());
System.out.println(exbean.getBirthday());
}
}
运行结果
Lixx
Man
Thu Jan 25 00:00:00 CST 1990
大家注意一下结果,有些人包括笔者在内第一眼看见结果时都会不禁疑惑,为什么日期的结果不是我们注入时的形式呢,其实仔细一想就能明白了,这是因为自定义的属性编辑器只是让我们能够定义自己注入时的书写方式并让那些Spring容器不能直接识别的类型在注入的时候转了弯而已,而实际注入的时候容器还是将我们注入的自定义形式的数据还是转换成了对应的类型,所以自定义属性编辑器只是方便了我们的注入并不能够改变注入的类型。