博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Spring4揭秘 BeanFactory】PropertyEditor
阅读量:4291 次
发布时间:2019-05-27

本文共 3578 字,大约阅读时间需要 11 分钟。

在Spring配置文件或配置类里,我们往往通过字面值为Bean各种类型的属性提供设置值:不管是double类型还是int类型,在配置文件中都对应字符串类型的字面值。BeanWrapper填充Bean属性时如何将这个字面值转换为对应的double或int等内部类型呢?我们可以隐约地感觉到一定有一个转换器在其中起作用,这个转换器就是属性编辑器。

一、 PropertyEditor

PropertyEditor是属性编辑器的接口,它规定了将外部设置值转换为内部JavaBean属性值的转换接口方法。PropertyEditor主要的接口方法说明如下:

· Object getValue():返回属性的当前值。基本类型被封装成对应的封装类实例;
· void setValue(Object newValue):设置属性的值,基本类型以封装类传入;
· String getAsText():将属性对象用一个字符串表示,以便外部的属性编辑器能以可视化的方式显示。缺省返回null,表示该属性不能以字符串表示;
· void setAsText(String text):用一个字符串去更新属性的内部值,这个字符串一般从外部属性编辑器传入;
· String[] getTags():返回表示有效属性值的字符串数组(如boolean属性对应的有效Tag为true和false),以便属性编辑器能以下拉框的方式显示出来。缺省返回null,表示属性没有匹配的字符值有限集合;
· String getJavaInitializationString():为属性提供一个表示初始值的字符串,属性编辑器以此值作为属性的默认值。

可以看出PropertyEditor接口方法是内部属性值和外部设置值的沟通桥梁。此外,我们可以很容易地发现该接口的很多方法是专为IDE中的可视化属性编辑器提供的:如getTags()、getJavaInitializationString()以及另外一些我们未此介绍的接口方法。

PropertyEditorSupport

Java为PropertyEditor提供了一个方便类:PropertyEditorSupport,该类实现了PropertyEditor接口并提供默认实现,一般情况下,用户可以通过扩展这个方便类设计自己的属性编辑器。

spring中的属性编辑器

Spring大部分默认属性编辑器都直接扩展于java.beans.PropertyEditorSupport类,用户也可以通过扩展PropertyEditorSupport实现自己的属性编辑器。比起用于IDE环境的属性编辑器来说,Spring环境下使用的属性编辑器的功能非常单一:仅需要将配置文件中字面值转换为属性类型的对象即可,并不需要提供UI界面,因此仅需要简单覆盖PropertyEditorSupport的setAsText()方法就可以了。

实现一 UUIDEditor
源码如下

public class UUIDEditor extends PropertyEditorSupport {
@Override public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.hasText(text)) { setValue(UUID.fromString(text)); } else { setValue(null); } } @Override public String getAsText() { UUID value = (UUID) getValue(); return (value != null ? value.toString() : ""); }}

使用方法

public static void main(String[] args) throws ClassNotFoundException, IOException {        //UUID对象转化为字符串        UUIDEditor editor=new UUIDEditor();        editor.setValue(UUID.randomUUID());        System.out.println(editor.getAsText());//c2878055-fb49-4559-a7db-c60fc3ebee79        //字符串转化为UUID        UUIDEditor editor_2=new UUIDEditor();        editor_2.setAsText("2-1-1-2-3");        System.out.println(editor_2.getAsText());//00000002-0001-0001-0002-000000000003        System.out.println(editor_2.getValue().getClass());//class java.util.UUID}

二、 PropertyEditorRegistry

这个接口可以注册和保存属性编辑器

public interface PropertyEditorRegistry {    void registerCustomEditor(Class
requiredType, PropertyEditor propertyEditor); void registerCustomEditor(Class
requiredType, String propertyPath, PropertyEditor propertyEditor); PropertyEditor findCustomEditor(Class
requiredType, String propertyPath);}

PropertyEditorRegistrySupport

PropertyEditorRegistrySupport是PropertyEditorRegistry 默认实现类

PropertyEditorRegistrySupport中有两个用于保存属性编辑器的Map类型变量:

private Map
, PropertyEditor> defaultEditors;private Map
, PropertyEditor> customEditors;

PropertyEditorRegistrySupport通过以下的代码定义默认属性编辑器:

private void createDefaultEditors() {        this.defaultEditors = new HashMap
, PropertyEditor>(64); // Simple editors, without parameterization capabilities. // The JDK does not contain a default editor for any of these target types. this.defaultEditors.put(Charset.class, new CharsetEditor()); this.defaultEditors.put(Class.class, new ClassEditor()); this.defaultEditors.put(Class[].class, new ClassArrayEditor()); this.defaultEditors.put(Currency.class, new CurrencyEditor()); this.defaultEditors.put(File.class, new FileEditor()); this.defaultEditors.put(InputStream.class, new InputStreamEditor()); //省略其他... }

转载地址:http://kshgi.baihongyu.com/

你可能感兴趣的文章
Java互联网架构-如何设计服务接口API限流功能
查看>>
Java互联网架构-Mysql分库分表订单生成系统实战分析
查看>>
Java开发大型互联网企业微服务架构简介及罕见的问题点
查看>>
初探Java源码之ArrayList
查看>>
Mysql性能优化实战:数据库锁的介绍与索引查找原理
查看>>
Java程序员该如何提升让自己成为高薪架构师?
查看>>
「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)
查看>>
Java虚拟机体系结构由几部分组成?
查看>>
用分布式日志优化单机数据库系统将成未来标配?
查看>>
Java互联网架构-深入理解MQ实现分布式事务
查看>>
Spring boot整合Springfox在线生成restful的api doc
查看>>
简单MySQL教程二
查看>>
mysql学习之 explain
查看>>
java搜索引擎Apache的solr初探-安装使用导入mysql数据
查看>>
Java互联网架构-企业级实战秒杀系统优化方案与应用思路
查看>>
简单介绍一下Spring / java中Spring框架7大核心模块的作用,如何在面试中侃侃而谈?/ Spring体系常用项目一览
查看>>
为什么使用mq?
查看>>
配置使用IM表达式的基本任务
查看>>
自定义JSP标签自动完成对页面按钮做权限拦截处理
查看>>
Java互联网架构-负载均衡原理与实现方案
查看>>