博客
关于我
spring5.1.x源码解析之四(自定义属性编辑器执行逻辑)
阅读量:637 次
发布时间:2019-03-13

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

文章目录

默认属性编辑器

这段代码的意思就设置默认属性编辑器

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); }

自定义属性编辑器方式一之直接注册

配置文件如下

自定义解析类

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方法,注册到BeanFactorycustomEditors属性,然后当执行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; ... }

自定义属性编辑器方式二之本地注册

配置文件

这里使用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,跟上述一样,执行的方法变了.会加载到BeanFactorypropertyEditorRegistrars属性中

@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; ... }

自定义属性编辑器方式三之自定义转换服务类

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

你可能感兴趣的文章
Nmap扫描教程之Nmap基础知识
查看>>
nmap指纹识别要点以及又快又准之方法
查看>>
Nmap渗透测试指南之指纹识别与探测、伺机而动
查看>>
Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
查看>>
NMAP网络扫描工具的安装与使用
查看>>
NMF(非负矩阵分解)
查看>>
nmon_x86_64_centos7工具如何使用
查看>>
NN&DL4.1 Deep L-layer neural network简介
查看>>
NN&DL4.3 Getting your matrix dimensions right
查看>>
NN&DL4.7 Parameters vs Hyperparameters
查看>>
NN&DL4.8 What does this have to do with the brain?
查看>>
nnU-Net 终极指南
查看>>
No 'Access-Control-Allow-Origin' header is present on the requested resource.
查看>>
No 'Access-Control-Allow-Origin' header is present on the requested resource.
查看>>
NO 157 去掉禅道访问地址中的zentao
查看>>
no available service ‘default‘ found, please make sure registry config corre seata
查看>>
No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
查看>>
no connection could be made because the target machine actively refused it.问题解决
查看>>
No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
查看>>
No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
查看>>