1. 程式人生 > >Spring屬性編輯器

Spring屬性編輯器

1 屬性編輯器

對於屬性編輯器我們一般分為Core Context的使用MVC的使用兩種

Core Context的使用

這裡寫圖片描述
Spring Core Context其實也使用ConversionService,但是是非強制的。

Spring在讀取xml配置檔案的時候,因為xml檔案實際上是一個文字檔案,所有值的設定都是String,這個時候如果給bean的複雜型別屬性設定值,它會用到PropertyEditor或ConversionService。

比如下面例子中的color屬性是Color型別,這時就會利用到PropertyEditor和ConversionService:

<bean id="someBean" class="a.b.c.SomeBean">
    <property name="color" value="red"/>
</bean>
MVC的使用

這裡寫圖片描述

Spring MVC對於conversionService的使用比較特殊,它自己會註冊一個名字叫做mvcConversionService型別為DefaultFormattingConversionService的Bean(程式碼在WebMvcConfigurationSupport#mvcConversionService)。因此會存在以下陷阱:

如果Core Context中也定義了一個ConversionService,那麼在MVC環境下,會有兩個ConversionService的Bean。

針對Core Context的ConversionService做的Customize如FormatterRegistrar、ConverterRegistry、FormatterRegistry、ConversionServiceFactoryBean、FormattingConversionServiceFactoryBean是不會應用到MVC的那個ConversionService上。 對於mvcConversionService的配置途徑見

這裡

2 用法

2.1 Core Context的使用

主要用運用:

PropertyEditorSupport類

PropertyEditorRegistrar

CustomEditorConfigurer

2.1.1 自定義註冊編輯器

public class PointPropertEditor extends PropertyEditorSupport{

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        String[] nums = text.split(","
); Point point = new Point(); point.setX(Integer.parseInt(nums[0])); point.setY(Integer.parseInt(nums[1])); setValue(point); } }

2.1.2 全域性配置

@Component
public class CustomPropertyEditorRegistrars implements PropertyEditorRegistrar{

    @Override
    public void registerCustomEditors(PropertyEditorRegistry registry) {
        registry.registerCustomEditor(Point.class, new PointPropertEditor());

    }

}
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
        <property name="propertyEditorRegistrars">
            <bean class="com.gz.spring.propertyEditor.CustomPropertyEditorRegistrars"/>
        </property>
<bean>

2.1.1 區域性配置

<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">  
    <property name="customEditors">  
        <map>  
            <entry key="com.gz.test.entity.Point">  
                <bean class="com.gz.spring.propertyEditor.PointPropertEditorr">  

                </bean>  
            </entry>  
        </map>  
    </property>  
</bean> 

2.2 MVC的使用

主要用運用:

PropertyEditorSupport類

@InitBinder

WebBindingInitializer介面

2.2.1 自定義註冊編輯器

public class DatePropertyEditor extends PropertyEditorSupport {
    private static final Logger logger = LoggerFactory.getLogger(DatePropertyEditor.class);
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        logger.info("型別轉換  傳入資料:"+text);
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");  
        try {
            setValue(df.parse(text));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

2.2.2 註冊屬性編輯器(註解)

2.2.2.1 單個類中@InitBinder註解(針對單個contoller)

@InitBinder
    private void PointDataBinder(WebDataBinder webDataBinder) {
        logger.info("型別轉換開始");
        webDataBinder.registerCustomEditor(Date.class, new DatePropertyEditor());
    }

2.2.2.2 整個專案@InitBinder註解(全域性)

@ControllerAdvice
public class InitBinderControllerAdvice {

  @InitBinder
  public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(Dept.class, new CustomDeptEditor());  
  }
}

2.2.3 註冊屬性編輯器(程式設計)

2.2.3.1 實現 WebBindingInitializer介面(全域性定義)

java程式碼:
public class DateWebBindingInitializer implements WebBindingInitializer{

    @Override
    public void initBinder(WebDataBinder binder, WebRequest request) {
        binder.registerCustomEditor(Date.class,  new DatePropertyEditor()); 
    }

}
spring配置檔案:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="com.mvc.editor.MyWebBindingInitializer" />
    </property>
</bean>