zoukankan      html  css  js  c++  java
  • Mybatis MetaObject和ObjectWrapper设计概念

    ObjectWrapper

    该类的作用是对象的包装,对对象属性的操作,其行为有

    BaseWrapper

    具备了MetaObject,对象包装的公共父类,主要处理集合类型

    BeanWrapper

    具备了储存对象的Object和MetaClass

    @Override
    public Object get(PropertyTokenizer prop) {
        if (prop.getIndex() != null) {
            // 使用MetaObject逐级实例化集合对象
            Object collection = resolveCollection(prop, object);
            // 使用MetaObject获得Value
            return getCollectionValue(prop, collection);
        } else {
            return getBeanProperty(prop, object);
        }
    }

    MetaObject

    private final Object originalObject;
    private final ObjectWrapper objectWrapper;
    private final ObjectFactory objectFactory;
    private final ObjectWrapperFactory objectWrapperFactory;
    private final ReflectorFactory reflectorFactory;
    
    private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
        this.originalObject = object;
        this.objectFactory = objectFactory;
        this.objectWrapperFactory = objectWrapperFactory;
        this.reflectorFactory = reflectorFactory;
    
        // 根据originalObject的类型实例化具体的ObjectMapper,将MetaObject自己注入进去,委派模式
        if (object instanceof ObjectWrapper) {
          this.objectWrapper = (ObjectWrapper) object;
        } else if (objectWrapperFactory.hasWrapperFor(object)) {
          this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
        } else if (object instanceof Map) {
          this.objectWrapper = new MapWrapper(this, (Map) object);
        } else if (object instanceof Collection) {
          this.objectWrapper = new CollectionWrapper(this, (Collection) object);
        } else {
          this.objectWrapper = new BeanWrapper(this, object);
        }
    }

    获得初始对象的属性值通过ObjectWrapper并可能委派给MetaObject来获得。

  • 相关阅读:
    svn:ignore 设置忽略文件
    Css让文字自适应Table宽度[转]
    自学python笔记
    java代码中添加log4j日志
    maven多模块项目搭建
    js || 与&&
    java内存溢出和tomcat内存配置
    xsl:for-each中引用循环外全局变量
    quartz启动两次(tomcat)
    pymysql简单封装
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/9829110.html
Copyright © 2011-2022 走看看