Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

属性编辑器 公共注入

Posted on 2009-02-16 19:46 啥都写点 阅读(155) 评论(0)  编辑  收藏 所属分类: J2EE

1、 spring的普通属性注入

参见:spring文档3.3章节

当有日期的时候 private Data d;

转换不了,报错,需要自己编写属性编辑器

例:

  

import java.beans.PropertyEditorSupport;

public class UtilDatePropertyEditor extends PropertyEditorSupport {

    private String format="yyyy-mm-dd";

   

    //复写setAsText方法

    publicvoid setAsText(String arg0) throws IllegalArgumentException {

      

       System.out.println("UtilDataPropertyEditor.saveAsText()--text"+arg0);

      

       SimpleDateFormat sdf = new SimpleDateFormat(format);

       try {

           Date d = sdf.parse(arg0);

           this.setValue(d);

       } catch (ParseException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

            }

 }

}

//写完后需要注册,配置在SPRING配置文件中(注入)

    <bean id="customEditorConfigurer" class="org.springframework.bean.factory.config.CustomEditorConfigurer">

       <property name="customEditors">

          <map>

             <entry key="java.util.Date">

               <bean class="com.bjsxt.spring.UtilDatePropertEditor">

<!-- 

<property name=”format” value=”yyyy/mm/dd” />

-->

</bean>

             </entry>

          </map>

       </property>

    </bean>

     <!--

     <bean id="utilDatePropertyEditor" class="com.bjsxt.spring.UtilDatePropertEditor"></bean>

-->

什么是属性编辑器,作用:

*自定义属性编辑器,spring配置文件中的字符串转换成相应的对象进行注入

Spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器

*如何定义属性编辑器?

*集成PropertyEditorSupport类,覆写setAsText()方法,参见:UtilDatePropertyEditor.java

*将属性编辑器注册到spring中,参见:applicationContext-editor.xml

        依赖对象的注入方式,可以采用:

* ref属性

* <ref>标签

*内部<bean>来定义

 Spring提供的其他定制编辑器包括:
  ClassEditor—使用包含全称类名的字符串设置java.lang.
     Class的属性。
  CustomDateEditor—使用某种 java.text.DateFomat 对
     象将一个字符串设置给 java.util.Date 属性。                                          
  FileEditor—使用包含文件路径的字符串设置java.io.File
     的属性。
  StringArrayPropertyEditor—将一个包含逗号的String
     转换成String数组属性。
  StringTrimmerEditor—自动修正字符串属性,可以选
     择将空字符转变成null。 
 
一个属性编辑器的简单示例:
  
  Contact类:

public class Contact {
   
private  PhoneNumber   phonenumber;
   
public void doSomething() {
   System.out.println(phonenumber);
   }


…..省略getter 、setter方法
}

PhoneNumber类:

public class PhoneNumber {
    
private String areaCode;
    
private String prefix;
    
private String number;
    
    PhoneNumber(String areaCode,
        String prefix,
        String number) 
{
    
this.areaCode = areaCode;
    
this.prefix = prefix;
    
this.number = number;
    }

    
public void getName() {
    System.out.println(
this.areaCode+this.prefix+this.number);
    }

}

编辑器类:

public class PhoneEditor extends PropertyEditorSupport {
   
private String stripNonNumberic(String original) {
StringBuffer allNumberic 
= new StringBuffer();   
   
for (int i = 0; i < original.length(); i++{
   
char c = original.charAt(i);
   
if(Character.isDigit(c)){
   allNumberic.append(c);
      }

 }

   
return allNumberic.toString();
   }

public void setAsText(String text) throws IllegalArgumentException {

String  stripped 
= stripNonNumberic(text);
String areaCode 
= stripped.substring(0,3).replace("4""f");
String prefix 
= stripped.substring(3,6).replace("6""g");
String number 
= stripped.substring(6,7);
PhoneNumber phone 
= new PhoneNumber(areaCode,prefix,number);
setValue(phone);
      }

}

applicationContext.xml中的配置

 <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
   
<property name="customEditors">
     
<map>
       
<entry key="com.spring.propertyeditor.PhoneNumber">
         
<bean class="com.spring.propertyeditor.PhoneEditor">
         
</bean>
       
</entry>
       
<entry key="java.util.Date">
          
<bean class="com.spring.propertyeditor.UtilDatePropertyEditor"></bean>
       
</entry>
     
</map>
   
</property>
</bean>
 
<bean id="contact" class="com.spring.propertyeditor.Contact">
   
<property name="phonenumber">
     
<value>4564679879412135464546</value>
   
</property>
   
<property name="date">
     
<value>1986-04-11</value>
   
</property>
 
</bean>

测试类代码:

public static void main(String[] args) {
ApplicationContext ac 
= new ClassPathXmlApplicationContext
                                                                        (
"applicationContext-propertyeditor.xml");

   Contact con 
= (Contact)ac.getBean("contact");

    con.getPhonenumber().getName();

}


运行结果:f564g79


     
  

如何将公共的注入定义描述出来?

   *通过<bean>标签定义公共的属性,指定abstract=true

   *具有相同属性的类在<bean>标签中指定其parent属性

参加:applicationContext-other.xml

    <bean id="beanAbstract" abstract="true">

       <property name="id" value=""/>

       <property name="name" value=""/>

    </bean>

    <bean id="bean3" class="" parent="beanAbstract">

       <property name="password">

       <value></value>

       </property>

    </bean>

 <bean id="" class="" parent="beanAbstract"/>



                                                                                                       --    学海无涯
        


只有注册用户登录后才能发表评论。


网站导航: