其他分享
首页 > 其他分享> > PropertyEditorRegistry

PropertyEditorRegistry

作者:互联网

PropertyEditorRegistry 接口的名字虽然和 org.springframework.beans.PropertyEditorRegistrar 接口名字很像,但是功能完全不一样;因为这个接口才是真正注册 Class 和 PropertyEditors 映射关系的,而这些映射关系都会保存到子类 PropertyEditorRegistrySupport 的缓存中。

public class PropertyEditorRegistrySupport implements PropertyEditorRegistry {
    private Map<Class<?>, PropertyEditor> defaultEditors;
    private Map<Class<?>, PropertyEditor> overriddenDefaultEditors;
    private Map<Class<?>, PropertyEditor> customEditors;

getDefaultEditor

通过 Class 获取默认属性编辑器,默认是指 Java 中常用数据类型的编辑器,例如:

该方法当中使用了两个缓存 defaultEditors 和 overriddenDefaultEditors,其中 defaultEditors 缓存是 createDefaultEditors 方法赋值的,赋值后就不会更改了。

但是 overriddenDefaultEditors 缓存是用来覆盖 defaultEditors 缓存的,而 overrideDefaultEditor 缓存是通过 overrideDefaultEditor 方法添加数据的,具体可以查看 PropertyEditorRegistrar;但是要注意:这里覆盖是使用另一个 Map 集合,而不是直接修改对应的值(为什么这样做我也没想明白)。

当该方法被调用时,首先查找 overriddenDefaultEditors 缓存,没找到才会查找 defaultEditors 缓存,还没有找到就会返回 null。

registerCustomEditor

你可以调用这个方法向 customEditors 缓存中,注册自定义属性编辑器;也可以调用 getCustomEditor 方法获取对应的属性编辑器。

注意 getCustomEditor 方法在查找对应的属性编辑器时,如果在 customEditors 缓存中没有找到,那么就会迭代这个缓存并查找 Class 的父级或接口是不是指定的类型。

private PropertyEditor getCustomEditor(@Nullable Class<?> requiredType) {
    for (Map.Entry<Class<?>, PropertyEditor> entry : this.customEditors.entrySet()) {
        Class<?> key = entry.getKey();
        if (key.isAssignableFrom(requiredType)) {

注册自定义属性编辑器

PropertyEditor 中创建了一个自定义的属性编辑器。

参考文章

Spring Property Editor – CustomEditorConfigurer Example

标签:Map,缓存,PropertyEditor,defaultEditors,编辑器,PropertyEditorRegistry,Class
来源: https://www.cnblogs.com/superylg/p/16355280.html