PropertyEditorRegistrySupport
介绍:接口:PropertyEditorRegistry的基本实现,负责默认编辑器和自定义编辑器的管理,主要服务于基类 BeanWrapperImpl。
重要属性:
private Map defaultEditors;//装载默认编辑器
private Map customEditors;//装载自定义编辑器
private Set sharedEditors;//装载共享编辑器
private Map customEditorCache;//自定义编辑器的缓存
主要方法:
取得默认属性编辑器:
public PropertyEditor getDefaultEditor(Class requiredType) {
......
return (PropertyEditor) this.defaultEditors.get(requiredType);/*取得给定属性类型的属性编辑器,defaultEditors 是以 requiredType为key ,PropertyEditor 为value的Map。这是通过下面的方法存放的。
*/
}
注册一个自定义属性编辑器:
public void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor) {
registerCustomEditor(requiredType, null, propertyEditor);/*这里null表示类型为requiredType的属性均可使用propertyEditor编辑器*/
}
注册完成在下面的方法:
public void registerCustomEditor(Class requiredType, String propertyPath, PropertyEditor propertyEditor) {/*requiredType 或 propertyPath 决定那些属性使用该PropertyEditor */
if (requiredType == null && propertyPath == null) {
throw new IllegalArgumentException("Either requiredType or propertyPath is required");
}/*最初需要定义一个存放自定义属性编辑器的Map*/
if (this.customEditors == null) {
this.customEditors = new LinkedHashMap(16);
}/*[color=red]属性名称(名称,或是嵌套路径)不空,则propertyEditor只是针对该属性注册的[/color]*/
if (propertyPath != null) {
this.customEditors.put(propertyPath, new CustomEditorHolder(propertyEditor, requiredType));
this.propertySpecificEditorsRegistered = true;
}
else {
[color=darkred]/*属性名称为空,则propertyEditor是针对属性类型为requiredType注册的*/[/color]
this.customEditors.put(requiredType, propertyEditor);
this.customEditorCache = null;
}
}
查找指定属性类型或是属性名称对应的编辑器:
public PropertyEditor findCustomEditor(Class requiredType, String propertyPath) {
......
if (propertyPath != null) {
if (this.propertySpecificEditorsRegistered) {
/*优先查找指定属性对应的属性编辑器*/
PropertyEditor editor = getCustomEditor(propertyPath, requiredType);
if (editor == null) {
List strippedPaths = new LinkedList();
addStrippedPropertyPaths(strippedPaths, "", propertyPath);/*沿着属性嵌套路径查找,直到找到为止*/
for (Iterator it = strippedPaths.iterator(); it.hasNext() && editor == null;) {
String strippedPath = (String) it.next();
editor = getCustomEditor(strippedPath, requiredType);
}
}
if (editor != null) {
return editor;
}
}
if (requiredType == null) {
requiredTypeToUse = getPropertyType(propertyPath);
}
}
/* 若是没有指定属性,则找指定属性类型的对应编辑器*/
return getCustomEditor(requiredTypeToUse);
}
取得属性编辑器的方法:
private PropertyEditor getCustomEditor(Class requiredType) {
if (requiredType == null) {
return null;
}
/* 首先直接按属性类型去获得 */
PropertyEditor editor = (PropertyEditor) this.customEditors.get(requiredType);
if (editor == null) {
/* 尝试在缓冲编辑器map里获得*/
if (this.customEditorCache != null) {
editor = (PropertyEditor) this.customEditorCache.get(requiredType);
}
if (editor == null) {
/*沿着属性路径去获得(它的超类) */
for (Iterator it = this.customEditors.keySet().iterator(); it.hasNext() && editor == null;) {
Object key = it.next();
if (key instanceof Class && ((Class) key).isAssignableFrom(requiredType)) {
editor = (PropertyEditor) this.customEditors.get(key);/* 为每种类型缓冲编辑器,以免以后重复查找*/
if (this.customEditorCache == null) {
this.customEditorCache = new HashMap();
}
this.customEditorCache.put(requiredType, editor);
}
}
}
}
return editor;
}
判断是否包含的数组/集合元素指定的编辑器:
public boolean hasCustomEditorForElement(Class elementType, String propertyPath) {
if (this.customEditors == null) {
return false;
}
if (propertyPath != null && this.propertySpecificEditorsRegistered) {/*遍历注册器属性路径,若存在与指定属性匹配的属性路径,且该属性路径对应编辑器持有者拥有元素类型对应的编辑器则返回true*/
for (Iterator it = this.customEditors.entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
if (entry.getKey() instanceof String) {
String regPath = (String) entry.getKey();
if (PropertyAccessorUtils.matchesProperty(regPath, propertyPath)) {
CustomEditorHolder editorHolder = (CustomEditorHolder) entry.getValue();
if (editorHolder.getPropertyEditor(elementType) != null) {
return true;
}
}
}
}
}
//若没有为该属性路径指定编辑器,则返回是否存在元素类型对应的属性编辑器
return (elementType != null && this.customEditors.containsKey(elementType));
}
分享到:
相关推荐
《Spring 2.5源码编译全解析》 在软件开发领域,深入理解框架的源码对于提升技术水平和优化应用至关重要。Spring作为Java领域的主流框架之一,其2.5版本是许多开发者学习和研究的基础。本文将详细介绍如何编译...
《Spring2.5 学习笔记》是一份深入解析Spring框架2.5版本的文档,旨在帮助开发者全面理解和掌握这一经典版本的核心特性与应用实践。Spring作为Java领域中最流行的轻量级框架之一,其2.5版本在当时的发布带来了许多...
《Spring 2.5 学习笔记》 在IT领域,Spring框架是Java企业级应用开发的首选框架,而Spring 2.5是其发展历史中的一个重要里程碑。本笔记将深入探讨Spring 2.5的核心特性,帮助读者理解并掌握这一版本的精髓。 一、...
下面我们将深入探讨Spring 2.5源码中的关键知识点。 1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一是DI,它允许对象之间的依赖关系在运行时通过配置或编程方式注入。在Spring 2.5中,DI...
spring2.5 学习笔记spring2.5 学习笔记spring2.5 学习笔记
通过对Spring 2.5源代码的深入研究,开发者不仅可以了解其工作原理,还能学习到良好的设计模式和最佳实践,提升自己的编程技能。此外,源代码中包含了各种设计模式的实例,如工厂模式、单例模式、观察者模式等,这...
通过对ProSpring 2.5源码的分析,我们可以深入学习Spring的核心概念和技术,掌握如何利用Spring进行高效的企业级应用开发。同时,这份源码也为我们提供了一个学习和实践的平台,有助于提升我们的编程技能和解决问题...
通过对Spring 2.5源代码的深入学习,你可以了解这些特性的实现原理,更好地理解Spring框架的工作机制,并能将其应用到实际项目中,提升软件开发的质量和效率。通过视频讲解和源代码结合的方式,学习效果将更为显著。
这个源码包包含的是 Spring 2.5 版本的源代码,对于开发者来说,深入理解这些源码能帮助我们更好地掌握 Spring 框架的工作原理,提升我们的开发技能。 1. **IoC 容器**: Spring 的核心是 Inversion of Control...
总的来说,Spring 2.5的学习涵盖了Bean的声明、属性注入、类型转换和后处理器的使用等关键概念。理解这些基础,将有助于深入掌握Spring框架,进一步提升应用程序的可维护性和灵活性。在实际开发中,结合注解驱动的...
### Spring2.5 学习笔记知识点概览 #### 第一课:面向抽象编程 - **概念理解**:面向抽象编程是一种设计模式,其核心思想是通过定义接口或抽象类来实现程序结构的设计,使具体实现与接口分离,增强系统的灵活性和...
《精通Spring2.5》是一本深度探讨Spring框架的权威指南,主要针对Spring 2.5版本进行深入解析。Spring是Java企业级应用开发中最受欢迎的框架之一,它以其轻量级、模块化的设计,以及对IoC(Inversion of Control,...
Spring 2.5版本是该框架的一个重要里程碑,它引入了许多改进和新功能,为开发者提供了更好的灵活性和控制力。以下是关于Spring 2.5的一些关键知识点: 1. **依赖注入(Dependency Injection, DI)**:Spring的核心...
Spring2.5中文参考手册是学习和理解Spring框架的重要资源,涵盖了上述所有核心概念和特性。通过深入阅读,开发者可以掌握如何利用Spring 2.5构建高效、灵活且易于维护的企业级应用。无论是在传统的J2EE环境中还是...
Spring框架是Java开发中不可或缺的一部分,它以其模块化、易用性和灵活性著称。Spring 2.5版本是该框架的一个重要里程碑,引入了许多新特性并优化...对于学习和掌握Spring 2.5,这份中文文档无疑是一份宝贵的参考资料。
总结,"Spring 2.5 MVC 完整项目"是一个综合性的学习和实践资源,涵盖了从项目初始化、错误处理到数据库操作的全过程。通过深入理解并实践该项目,开发者不仅能掌握Spring MVC的核心概念,还能提升在实际项目中的...
通过阅读《Spring2.5-中文参考手册.chm》这份文档,开发者可以深入了解Spring 2.5的各种特性和用法,解决实际开发中遇到的问题,提升开发效率。文档不仅包含详细的API参考,还包含丰富的示例和最佳实践指导,是学习...
### Spring2.5 学习笔记详解 #### 一、Spring 框架简介 Spring 是一个开源的轻量级 Java 开发框架,主要用于简化企业级应用的开发工作。Spring 提供了一系列强大的功能,比如控制反转 (Inversion of Control, IOC)...