Spring4.x 笔记(10):Ioc 容器高级-属性编辑器

JavaBean 编辑器

概述

  1. java.beans.PropertyEditor 接口定义了设置 JavaBean 属性的方法
  2. java.beans.BeanInfo 接口描述了 JavaBean 哪些属性是可定制的,描述了可定制属性与PropertyEditor 接口的对应关系,每一个属性对应一个属性描述器 PropertyDescriptor
  3. java.beans.PropertyEditorManager 负责管理默认属性编辑器。内部保存一些常见类型的属性编辑器

PropertyEditor 属性编辑器接口

  1. PropertyEditor 规定了将外部设置值转换为内部 JavaBean 属性值的转换接口方法,主要方法如
方法描述
void setValue(Object value)设置属性的值
Object getValue()返回属性的当前值
String getAsText()将属性对象用一个字符串表示
void setAsText(String text)用一个字符串去更新属性的内部值,这个字符串一般从外部属性编辑器传入
  1. 实现类 PropertyEditorSupport,一般情况下用户自定义可以扩展这个类

Spring 的属性编辑器

在 Spring 配置文件中,通过字面值为 Bean 各种类型的属性提供设置值,不管是int还是double,在配置文件中都对应字符串类型的字面值。BeanWrapper 在填充 Bean 属性时,使用属性编辑器将字面值正确的转换为对应的内部类型

Spring 为常见的属性类型提供了默认的属性编辑器。BeanWrapperImpl 类扩展了 PropertyEditorRegistrySupport 类。PropertyEditorRegistrySupport 类为常见属性类型提供默认的属性编辑器

PropertyEditorRegistrySupport

  1. PropertyEditorRegistrySupport 中常见类型,分为三类(核心在其 createDefaultEditors 方法中)
类别描述
基础数据类型分为几个小类:基本数据类型(boolean、int)、基础数据类型封装类(Long、Integer)、基本类型的数组(char[]、byte[])、大数类(BigDecimal、BigInteger)
集合类型5中集合类(Collection、Set、SortedSet、List、SortedMap)
资源类型用于访问外部资源的常见类(Class、Class[]、File、InputStream、Locale等)
  1. 两个属性
属性描述
Map<Class<?>, PropertyEditor> defaultEditors保存默认属性类型的编辑器,key-属性类型、value-属性编辑器实例
Map<Class<?>, PropertyEditor> customEditors保存用户自定义的属性编辑器

自定义属性编辑器

  1. 继承 java.beans.PropertyEditorSupport,如CustomDateEditor、CustomNumberEditor等
class CustomEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        String[] split = text.split(",");
        Person person = new Person();
        person.setName(split[0]);
        person.setAge(split[1]);
        setValue(person);
    }
}
  1. 注册自定义属性编辑器 org.springframework.beans.factory.config.CustomEditorConfigurer
<!--注册自定义的属性编辑器-->
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
    <property name="customEditors">
        <map>
            <!--属性编辑器对应的属性类型-->
            <entry key="com.learning.spring.optimaze.property.editor.PropertyEditor.Person"
                   value="com.learning.spring.optimaze.property.editor.PropertyEditor.CustonEditor"/>
        </map>
    </property>
</bean>
  1. SpringMVC 中属性编辑器使用
@InitBinder
public void initBinder(ServletRequestDataBinder binder) {

    binder.registerCustomEditor(Date.class,
            new CustomDateEditor(new SimpleDateFormat("yyyy-mm-dd"), true));
}


/**
 * 初始化数据绑定
 * 1. 将所有传递进来的String进行HTML编码,防止XSS攻击
 * 2. 将字段中Date类型转换为String类型
 */
@InitBinder
protected void initBinder(WebDataBinder binder) {
	// String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击
	binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
		@Override
		public void setAsText(String text) {
			setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
		}
		@Override
		public String getAsText() {
			Object value = getValue();
			return value != null ? value.toString() : "";
		}
	});
	// Date 类型转换
	binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
		@Override
		public void setAsText(String text) {
			setValue(DateUtils.parseDate(text));
		}
	});
}

参考

  1. 源码地址

Fork me on Gitee

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值