文章稍微有点儿长........
BeanWrapper 是 Spring 中比较重要的一个接口、我们在 Spring 获取单例流程(三) 中曾见过
PropertyDescriptor 我们在 Java 内省 有介绍过
我们先一个个的介绍它所继承的接口
PropertyEditorRegistry
要介绍 PropertyEditorRegistry 首先要介绍下 PropertyEditor。
PropertyEditor
俗称属性编辑器、原本只是在 GUI 中将字符串转换为 Java 对象的相应类型的、比如说、字符串转为数值、布尔类型。Spring 也在 JDK 原有的基础上扩展了不少属性编辑器。该类为 JDK 提供。
该接口非线程安全。
PropertyEditorSupport
PropertyEditor 的子类、JDK 提供。方便我们继承该基础类、可以方便的扩展属性编辑器。
可以看到、一些常见的属性编辑器都是继承于它。
PropertyEditorRegistry
再回到我们的属性编辑器注册器。Spring 提供。
主要就是给我们注册对应类型的属性编辑器。比如将 Charset 和 CharsetEditor 注册到这里。
PropertyEditorRegistrySupport
该类是继承 PropertyEditorRegistry 并在里面帮我们注册了一些常用的类型以及对应的属性编辑器
PropertyEditorRegistrar
属性编辑器登记员?
This is the central interface that a {@link PropertyEditorRegistrar} operates on. 复制代码
它是专门操作 PropertyEditorRegistry 的
public interface PropertyEditorRegistrar { /** * Register custom {@link java.beans.PropertyEditor PropertyEditors} with * the given {@code PropertyEditorRegistry}. * <p>The passed-in registry will usually be a {@link BeanWrapper} or a * {@link org.springframework.validation.DataBinder DataBinder}. * <p>It is expected that implementations will create brand new * {@code PropertyEditors} instances for each invocation of this * method (since {@code PropertyEditors} are not threadsafe). * @param registry the {@code PropertyEditorRegistry} to register the * custom {@code PropertyEditors} with */ void registerCustomEditors(PropertyEditorRegistry registry); } 复制代码
ResourceEditorRegistrar
作为 PropertyEditorRegistrar 的唯一子类、它会在你注册属性编辑器注册器的时候为你注册上一些常用的资源相关的属性编辑器。
这个类在 ApplicationContext 的 refresh 的 prepareBeanFactory 中被创建赋值到 BeanFactory 中
而 org.springframework.beans.PropertyEditorRegistrar#registerCustomEditors 方法在每次创建 bean 的时候都会被调起。
protected void initBeanWrapper(BeanWrapper bw) { bw.setConversionService(getConversionService()); registerCustomEditors(bw);// BeanWrapper 实现了 PropertyEditorRegistry 接口 } 复制代码