Skip to content

ProgramGuide

agapple edited this page Feb 28, 2013 · 3 revisions

介绍BeanMapping的内部设计&扩展点

介绍

iteye相关文章:

总体设计

相关说明:

  • 将属性mapping的动作抽象成Get/ Se两个操作。 Get操作针对数据源对象,Set操作针对数据目标对象
  • 在Get/Set中间,定义了一个ValueProcess处理插件的概念,允许扩展相关的功能插件 (自认为相比于BeanUtils/BeanCopier的非常好的亮点,扩展性良好)
  • 整个BeanMapping是采用微内核的设计,自身的一些功能点也是通过ValueProcess插件.

Get/Set设计

  1. Get操作抽象为GetExecutor
    • FieldGetExecutor
    • MapGetExecutor
    • PropertyGetExecutor
    • ThisSymbolGetExecutor
  2. Set操作抽象为SetExecutor
    • FieldSetExecutor
    • MapSetExecutor
    • PropertySetExecutor

说明:

  1. GetExecutor/SetExecutor的选择处理,客户端可通过Uberspector进行获取
  2. Uberspector.getInstance().getGetExecutor(Class locatorClass, Object identifier)
    Uberspector.getInstance().getSetExecutor(Class locatorClass, Object identifier, Class arg)
  3. Executor的抽象,允许自定义新的Get/Set操作处理,比如Factory模式的支持等,扩展相对比较容易

实现自定义Get/SetExecutor

TODO

相关类图设计

ValueProcess设计

ValueProcess是本工具设计的核心点,也是相应的功能扩展点. 它在这个mapping过程中,所处的位置就是Get,Set的当中,允许动态的进行修改。

默认支持的几个ValueProcess插件:

相关类图设计:

实现自定义ValueProcess

ValueProcess接口:

public interface ValueProcess {

    public Object process(Object value, ValueProcessInvocation invocation) throws BeanMappingException;

}

CustomValueProcess:

public class CustomValueProcess implements ValueProcess {

    public Object process(Object value, ValueProcessInvocation invocation) throws BeanMappingException {
		ValueProcessContext context = invocation.getContext();
		if(context xxxx) {
			// do with something
		} 
		
		return invocation.proceed(value); // 继续传递
    }
}

相关说明:

  1. ValueProcessContext整个ValueProcess处理过程中的上下文相关数据
    • BeanMappingParam: 当前需要进行mapping操作的相关参数对象
    • BeanMappingObject: 当前需要进行mapping操作的相关配置对象(基于XML or Mapping API)后的解析结果
    • BeanMappingField: 当前进行mapping操作的field属性配置对象(比如src/target field)
  2. ValueProcessInvocation: 为ValueProcess的调度控制器
    • invocation.getContext(): 可获取ValueProcessContext对象
    • invocation.proceed(value): 传递给chian ValueProcess的下一个节点

客户端设计

  • BeanMapping : 本轮子的核心功能,通过基于配置方式的mapping映射,支持convetor,defaultValue,script的所有功能。要求使用之前必须提前配置bean-mapping映射。
  • BeanCopy 和 BeanMap : 都是一些扩展功能,基于本轮子的核心架构不变的基础上,开发了BeanUtils.copyProperties() , BeanUtils.describe, BeanUtils.populate()的功能。 使用该api,可以不需要配置映射文件,会进行自动扫描,就是基于同名属性的处理前提。
  • BeanMappingUtil : 提供了BeanMapping , BeanCopy , BeanMap的所有方法,提供静态的util方法处理。每次都会构造对应的BeanMapping等对象,注意:每次进行构造BeanCopy,BeanMap,解析的属性结果会有cache。所以使用该util不会有很明显的性能下降,无非就是多一些临时对象。