Mybatis-Reflector

Mybatis中的Reflector是反射的二次封装,主要负责提高getter/setter方法的效率。ReflectorFactory接口用于缓存Class信息,提升性能。DefaultReflectorFactory是其实现,通过ConcurrentHashMap缓存Reflector对象。当访问Bean的Property/Field时,Mybatis通过Invoker接口提供统一的操作,无论Bean是否有getter/setter。这样设计确保了对无getter/setter字段和有getter/setter字段的一致性处理,解决了不同情况下的操作差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mybatis是一个ORM(Object Relation Mapping)框架,既然是ORM框架,那么DB与POJO之间的相互映射必然是其重要工作之一。Reflector是对反射的二次封装。它更侧重于增强getter/setter方法。Reflector对Getter/Setter的增强主要围绕以下几点:

1.缓存Class信息,提高效率。

缓存class信息实际上并不是由Reflector本身来完成的,而是由ReflectorFactory接口负责,其接口定义如下:

/**
 * 缓存Reflector对象,以达到复用的目的
 * */
public interface ReflectorFactory {

  /**
   * 缓存开关
   * */
  boolean isClassCacheEnabled();

  void setClassCacheEnabled(boolean classCacheEnabled);

  /**
   * 查找并返回Reflector
   * */
  Reflector findForClass(Class<?> type);
}

mybatis提供了默认实现:

public class DefaultReflectorFactory implements ReflectorFactory {
  private boolean classCacheEnabled = true;
  /**
   * 缓存Reflector
   * **/
  private final ConcurrentMap<Class<?>, Reflector> reflectorMap = new ConcurrentHashMap<>();

  public DefaultReflectorFactory() {
  }

  @Override
  public boolean isClassCacheEnabled() {
    return classCacheEnabled;
  }

  @Override
  public void setClassCacheEnabled(boolean classCacheEnabled) {
    this.classCacheEnabled = classCacheEnabled;
  }

  @Override
  /**
   * 查找并返回Reflector对象,如果开启Reflector缓存,则从缓存中读取,
   * 否则new一个返回
   * 如果从缓存中查找但没有找到,new一个存入缓存后返回。
   * **/
  public Reflector findForClass(Class<?> type) {

   //  如果启用classCacheEnable 则从reflectorMap中查找,如果存在则返回,如果不存在,new一个存入reflectorMap中并返回
    if (classCacheEnabled) {
      // synchronized (type) removed see issue #461
      return MapUtil.computeIfAbsent(reflectorMap, type, Reflector::new);
    } else {
      //否则直接new后返回
      return new Reflector(type);
    }
  }
}

2.使用Invoker接口统一操作Property/Field

有一些Bean中没有提供getter/setter,在这种情况下,mybaits会调用 field.get(),field.set()来完成读写操作,而提供了getter/setter的则调用getter/setter方法来完成读写,为了屏蔽这种差异,mybatis抽象出了Invoker接口。

3.解决冲突

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值