默认属性编辑器
这段代码的意思就设置默认属性编辑器
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
...
//设置默认属性编辑器
//registerBeanPostProcessors会注册所有自定义编辑器,对应AbstractBeanFactory.customEditors
//AbstractBeanFactory.initBeanWrapper会使用编辑器,对应AbstractBeanFactory.propertyEditorRegistrars
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
...
}
在初始化BeanWrapper的时候会注册属性编辑器到BeanWrapper中
/*
org.springframework.beans.factory.support.AbstractBeanFactory#initBeanWrapper
*/
protected void initBeanWrapper(BeanWrapper bw) {
...
//注册编辑器
registerCustomEditors(bw);
}
protected void registerCustomEditors(PropertyEditorRegistry registry) {
...
//批量注册通用属性编辑器
if (registry instanceof PropertyEditorRegistrySupport) {
((PropertyEditorRegistrySupport) registry).overrideDefaultEditor(requiredType, editor);
}
...
}
}
执行到这里基本就注册到BeanWrapper中overriddenDefaultEditors属性了
public void overrideDefaultEditor(Class<?> requiredType, PropertyEditor propertyEditor) {
if (this.overriddenDefaultEditors == null) {
this.overriddenDefaultEditors = new HashMap<>();
}
this.overriddenDefaultEditors.put(requiredType, propertyEditor);
}
自定义属性编辑器方式一之直接注册
配置文件如下
<bean id="userDate" class="org.example.custom.editor.UserDate">
<property name="dataValue" value="2010-10-10"/>
</bean>
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.util.Date" value="org.example.custom.editor.DatePropertyEditor">
</entry>
</map>
</property>
</bean>
自定义解析类
public class DatePropertyEditor extends PropertyEditorSupport {
private String format = "yyyy-MM-dd";
public void setFormat(String format) {
this.format = format;
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
try {
Date parse = simpleDateFormat.parse(text);
this.setValue(parse);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
首先可以看到配置文件配置的CustomEditorConfigurer类继承了BeanFactoryPostProcessor接口,这个接口的意思就是生成bean之前首先执行这个接口里面postProcessBeanFactory方法
public class CustomEditorConfigurer implements BeanFactoryPostProcessor, Ordered {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
if (this.propertyEditorRegistrars != null) {
for (PropertyEditorRegistrar propertyEditorRegistrar : this.propertyEditorRegistrars) {
beanFactory.addPropertyEditorRegistrar(propertyEditorRegistrar);
}
}
...
}
}
当执行invokeBeanFactoryPostProcessors方法的时候,会查询所有的继承了BeanFactoryPostProcessor接口的postProcessBeanFactory方法
@Override
public void refresh() throws BeansException, IllegalStateException {
...
// Invoke factory processors registered as beans in the context.
//激活各种BeanFactory处理器
//BeanFactoryPostProcessor作用域容器级,仅仅对容器中的bean进行后置处理,如propertyPlaceholderConfig,继承order可实现排序调用功能
//BeanFactoryPostProcessor可以修改实际的bean实例
invokeBeanFactoryPostProcessors(beanFactory);***
}
这个时候就会把配置文件配置了customEditors属性的值经过CustomEditorConfigurer类的postProcessBeanFactory方法,注册到BeanFactory的customEditors属性,然后当执行registerCustomEditors的时候注册
/*
注册默认属性编辑器
注册自定义属性编辑器
*/
protected void registerCustomEditors(PropertyEditorRegistry registry) {
...
//注册自定义属性编辑器
if (!this.customEditors.isEmpty()) {
this.customEditors.forEach((requiredType, editorClass) ->
registry.registerCustomEditor(requiredType, BeanUtils.instantiateClass(editorClass)));
}
}
执行注册方法,注册到customEditors缓存中
@Override
public void registerCustomEditor(@Nullable Class<?> requiredType, @Nullable String propertyPath, PropertyEditor propertyEditor) {
...
//注册自定义属性编辑器
if (this.customEditors == null) {
this.customEditors = new LinkedHashMap<>(16);
}
this.customEditors.put(requiredType, propertyEditor);
this.customEditorCache = null;
...
}
自定义属性编辑器方式二之本地注册
配置文件
<!-- 注册自定义属性解析器2 初始化的时候,调用注入本地方法注册-->
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="propertyEditorRegistrars">
<list>
<bean class="org.example.custom.editor.DatePropertyEditorRegistry"></bean>
</list>
</property>
</bean>
这里使用spring提供的解析器
public class DatePropertyEditorRegistry implements PropertyEditorRegistrar {
public void registerCustomEditors(PropertyEditorRegistry registry) {
registry.registerCustomEditor(Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
}
用的还是CustomEditorConfigurer,只不过注入的属性是propertyEditorRegistrars,跟上述一样,执行的方法变了.会加载到BeanFactory的propertyEditorRegistrars属性中
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
//注册
if (this.propertyEditorRegistrars != null) {
for (PropertyEditorRegistrar propertyEditorRegistrar : this.propertyEditorRegistrars) {
beanFactory.addPropertyEditorRegistrar(propertyEditorRegistrar);
}
}
..
}
在初始化BeanWrapper的时候会执行以下方法
protected void registerCustomEditors(PropertyEditorRegistry registry) {
...
//批量注册通用属性编辑器
registrar.registerCustomEditors(registry);
...
}
然后调用我们自定义的类进行注册
public class DatePropertyEditorRegistry implements PropertyEditorRegistrar {
public void registerCustomEditors(PropertyEditorRegistry registry) {
registry.registerCustomEditor(Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
}
执行注册方法,注册到customEditors缓存中
@Override
public void registerCustomEditor(@Nullable Class<?> requiredType, @Nullable String propertyPath, PropertyEditor propertyEditor) {
...
//注册自定义属性编辑器
if (this.customEditors == null) {
this.customEditors = new LinkedHashMap<>(16);
}
this.customEditors.put(requiredType, propertyEditor);
this.customEditorCache = null;
...
}