「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」
1.简介
PropertyEditorRegistry : 属性编辑器注册表,顾名思义,主要的作用就是保存 属性编辑器(PropertyEditor),根据需要返回对应的属性编辑器。
PropertyEditor :属性编辑器的接口,它规定了将外部设置值转换为内部JavaBean属性值的转换接口方法
本文主要讲一讲它们两的作用和关系
2.PropertyEditor
2.1 继承关系
从上图我们可以发现它的主要的常用的实现类,基本都是 PropertyEditorSupport 下面,我们通常可以继承它,实现自己的自定义属性编辑器,如常见的:String类型属性编辑器,Character类型编辑器....等,都是它的子类。
2.2 主要方法
- void setValue(Object value); :设置更改对象的值,如果是基本类型数据必须要转成包装类,如 int类型数据要转成 Integer
- Object getValue() :获取属性的值,基本类型数据必须要转成包装类型
- boolean isPaintable() :确定此属性编辑器是否可绘制。
- void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box):将值的表示形式绘制到屏幕的给定区域中。
- String getJavaInitializationString() :返回可用于设置属性的Java代码的片段匹配编辑当前状态。
- String getAsText() : 以文本的形式获取该属性的值,返回一个String类型的结果
- void setAsText(String text) throws java.lang.IllegalArgumentException : 通过解析给定字符串来设置属性值,如果解析不了会抛异常。
- String[] getTags() : 返回表示有效属性值的字符串数组(如boolean属性对应的有效Tag为true和false),以便属性编辑器能以下拉框的方式显示出来。缺省返回null,表示属性没有匹配的字符值有限集合
- java.awt.Component getCustomEditor() :返回一个组件,可以让人直接编辑当前属性值。如果为空,则可能为空
- boolean supportsCustomEditor() : 确定该属性是否支持自定义编辑。
- void addPropertyChangeListener(PropertyChangeListener listener) : 为值的更改添加一个监听器,当值修改后,触发的监听器事件
- void removePropertyChangeListener(PropertyChangeListener listener) : 移除上面设置的监听器
3.PropertyEditorRegistry
3.1 主要继承关系
这张图是我们后续在讲Spring 容器初始化时,主要用到的,大家可以看到,下面有几个比较重要的实现类,BeanWrapperImpl , TypeConverterSupport 等。 下面这张图主要列出了数据绑定相关的继承关系
3.2 主要方法
- void registerCustomEditor(Class<?> requiredType, PropertyEditor propertyEditor);
- 注册一个指定类型的属性编辑器
- requiredType:指定的属性类型
- propertyEditor :属性编辑器
- void registerCustomEditor(@Nullable Class<?> requiredType, @Nullable String propertyPath, PropertyEditor propertyEditor);
- 为指定类型注册一个自定义的属性编辑器
- requiredType:指定的属性类型
- propertyPath:属性的路径(名称或嵌套路径),如果为null给定类型的所有属性注册编辑器
- propertyEditor :属性编辑器
- PropertyEditor findCustomEditor(@Nullable Class<?> requiredType, @Nullable String propertyPath)
- 通过指定的类型和属性,查找自定义属性编辑器
- requiredType : 指定的类型
- propertyPath :指定的属性的路径
4.总结
从上面的方法可以很容易的看出 PropertyEditorRegistry 主要就是为了添加和查找 PropertyEditor。在Spring,创建bean时 就会通过 PropertyEditorRegistry 取出对应的 PropertyEditor,给对应的 属性设置或修改它的值。