Spring自定义属性编辑器CustomEfitorConfigurer使用实例

假设有如下两个类:

 

package customerPropertyEditor;

public class Contact {
  
private PhoneNumber phoneNumber;

public PhoneNumber getPhoneNumber() {
    
return phoneNumber;
}


public void setPhoneNumber(PhoneNumber phoneNumber) {
    
this.phoneNumber = phoneNumber;
}

}



package customerPropertyEditor;

public class PhoneNumber {
  
private String areaCode;
  
private String prefix;
  
private String number;
  
public PhoneNumber(){
      
  }

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

public String getAreaCode() {
    
return areaCode;
}

public void setAreaCode(String areaCode) {
    
this.areaCode = areaCode;
}

public String getNumber() {
    
return number;
}

public void setNumber(String number) {
    
this.number = number;
}

public String getPrefix() {
    
return prefix;
}

public void setPrefix(String prefix) {
    
this.prefix = prefix;
}

public String toString(){
    
return this.getAreaCode()+"-"+this.getPrefix()+"-"+this.getNumber();
}

}

 我们想装配一个持久一个phoneNumber对象的contact,需要做如下配置

 

<bean id="phoneNumnber" class=".......">
     
<constructor-arg index="0">
          
<value>800</value>
    
</constructor-arg>
  
<constructor-arg index="1">
          
<value>810</value>
    
</constructor-arg>
  
<constructor-arg index="2">
          
<value>8181</value>
    
</constructor-arg>
</bean>

<bean id="contact" class=".....">
   
<property value="phoneNumber">
      
<ref bean="phoneNumnber"/>
  
</property>
</bean>

 

使用Spring提供的自定义属性编辑器功能(其实是spring支持java.beans.PropertyEditorSupport)

我们可以用这样的方式来装配contact

 

 <bean id="contact" class="customerPropertyEditor.Contact">
   
<property name="phoneNumber">
    
<value>800-810-8181</value>
   
</property>
 
</bean>


是不是方便了许多呢?

首先我们需要自定一个属性编辑器,并返回一个装配好的PhoneNumnber对象

这里要类名命名规范,如果我们需要自定义编辑器操作的类名为PhoneNumber,我们编辑器类名就是PhoneNumberEditor

package customerPropertyEditor;

import java.beans.PropertyEditorSupport;

public class PhoneNumberEditor extends PropertyEditorSupport {


    
public void setAsText(String text) throws IllegalArgumentException {
        String stripped
=convertToNumberic(text);
        String areaCode
=stripped.substring(0,3);
        String prefix
=stripped.substring(3,6);
        String number
=stripped.substring(6);
        PhoneNumber phoneNumber
=new PhoneNumber(areaCode,prefix,number);
        setValue(phoneNumber);
        
    }

    
public String convertToNumberic(String str){
        StringBuffer buffer
=new StringBuffer();
        
for(int i=0;i<str.length();i++){
            
char c=str.charAt(i);
            
if(Character.isDigit(c)){
                buffer.append(c);
            }

        }

        
return buffer.toString();
    }


}

 

接下来,在spring配置文件中注册自定义编辑器

注意CustomEfitorConfigurer特别容易写成CustomerEfitorConfigurer

 <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
   
<property name="customeEditors">
     
<map>
       
<entry key="customerPropertyEditor.PhoneNumber">
         
<bean id="phoneNumberEditor" class="customerPropertyEditor.PhoneNumberEditor"/>
       
</entry>
     
</map>
   
</property>
 
</bean>

 

测试代码:

 

package customerPropertyEditor;

import java.io.File;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

public class TestCustomerPropertyEditor {
    
public static void main(String[] args) {
        String filePath
=System.getProperty("user.dir")+File.separator+"customerPropertyEditor"+File.separator+"hello.xml";    
        BeanFactory factory
=new XmlBeanFactory(new FileSystemResource(filePath));            
        Contact contact
=(Contact)factory.getBean("contact");
        System.out.println(contact.getPhoneNumber());
    }

}

 

运行结果:

800-810-8181

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值