当前位置: 首页 > news >正文

石家庄网站开发公司网站关键词优化报价

石家庄网站开发公司,网站关键词优化报价,网页设计欣赏网页设计模板,佰维网站建设插件原理与开发 在 Mybatis总体执行流程 一文中简单的介绍了插件的初始化过程,本文将从源码的角度介绍一下mybatis的插件原理与简单开发实战。 插件原理 插件的注册和管理是通过InterceptorChain进行的,在创建Executor、StatementHandler、ParameterH…

插件原理与开发

在 Mybatis总体执行流程 一文中简单的介绍了插件的初始化过程,本文将从源码的角度介绍一下mybatis的插件原理与简单开发实战。

插件原理

插件的注册和管理是通过InterceptorChain进行的,在创建Executor、StatementHandler、ParameterHandler、ResultSetHandler对象时,会执行InterceptorChain的pluginAll方法

  public Object pluginAll(Object target) {// 遍历所有的插件for (Interceptor interceptor : interceptors) {// 执行插件的plugin方法,返回代理对象target = interceptor.plugin(target);}return target;}

拦截的原理,正是此时返回的代理对象,当调用目标方法时,执行的就是拦截器的intercept方法,从而实现拦截功能。

      // 执行插件的plugin方法,返回代理对象target = interceptor.plugin(target);

来到Interceptor接口的plugin方法:

  default Object plugin(Object target) {return Plugin.wrap(target, this);}

这是一个默认方法,一般不会重写它的逻辑。看其实现Plugin#wrap:

  public static Object wrap(Object target, Interceptor interceptor) {// 拿到拦截器的@Intercepts注解信息:key是要拦截的接口,value是要拦截的接口方法集合Map<Class<?>, Set<Method>> signatureMap = getSignatureMap(interceptor);// 这里的target,就是拦截的对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler对象)Class<?> type = target.getClass();// 返回包含在signatureMap中的接口Class<?>[] interfaces = getAllInterfaces(type, signatureMap);// 存在被拦截的接口,返回一个代理对象if (interfaces.length > 0) {// 利用jdk动态代理生成代理对象:关注Plugin(实现了InvocationHandler接口)的invoke方法return Proxy.newProxyInstance(type.getClassLoader(),interfaces,new Plugin(target, interceptor, signatureMap));}// 接口没有被拦截,返回原始对象return target;}

可以看到,如果接口被拦截了,就会利用JDK动态代理生成代理对象,由于Plugin实现了InvocationHandler接口,所以其invoke方法会被执行:

  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {try {// 拿到被拦截的接口方法集合Set<Method> methods = signatureMap.get(method.getDeclaringClass());// 判断当前执行的方法是否包含在其中,包含就是被拦截的方法if (methods != null && methods.contains(method)) {// 执行自定义拦截器的intercept方法,并将目标对象、方法、参数传入return interceptor.intercept(new Invocation(target, method, args));}// 否则直接执行原始方法return method.invoke(target, args);} catch (Exception e) {throw ExceptionUtil.unwrapThrowable(e);}}

插件开发

自定义插件需要:

  1. 实现Interceptor接口,重写intercept方法

  2. 使用@Intercepts和@Signature注解表明需要拦截哪些类的哪些方法

  3. 在配置文件中,添加插件配置

mybatis官网中,对此也有所描述:mybatis – MyBatis 3 | Configuration

根据官网描述,mybatis插件可以拦截的方法如下:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

以下是我写的一个记录SQL及其耗时的拦截器,加深对拦截器的理解:

/*** @Author: qiuxinfa* @CreateTime: 2023-12-07  22:15* @Description: 自定义拦截器:打印SQL、统计SQL执行时间*/
@Intercepts({@Signature(type = StatementHandler.class,method = "batch",args = {Statement.class}),@Signature(type = StatementHandler.class,method = "update",args = {Statement.class}),@Signature(type = StatementHandler.class,method = "query",args = {Statement.class, ResultHandler.class}),
})
public class SqlLogPlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 获取执行的SQLString sql;Statement statement=(Statement) invocation.getArgs()[0];if(Proxy.isProxyClass(statement.getClass())){MetaObject metaObject= SystemMetaObject.forObject(statement);Object h = metaObject.getValue("h");if(h instanceof StatementLogger){RoutingStatementHandler rsh=(RoutingStatementHandler) invocation.getTarget();sql = rsh.getBoundSql().getSql();}else {PreparedStatementLogger psl=(PreparedStatementLogger) h;sql = psl.getPreparedStatement().toString();}}else{sql = statement.toString();}// 记录开始时间long start = System.currentTimeMillis();// 执行目标方法Object result = invocation.proceed();// 记录结束时间long end = System.currentTimeMillis();System.err.println("执行SQL ===> ");System.err.println(sql);System.err.println("统计SQL耗时 = " + (end - start) + "毫秒");System.err.println("返回结果 =======> " + result);return result;}
}

配置文件添加插件:

    <!-- 配置插件    --><plugins><plugin interceptor="com.qxf.plugin.SqlLogPlugin"></plugin></plugins>

配置之后,会打印执行的SQL语句及其耗时。

http://www.khdw.cn/news/66671.html

相关文章:

  • wordpress 顶部自定义安卓优化大师
  • 老师让做网站怎么做郑州网站建设最便宜
  • 网站开发eq编辑器百度一下搜索一下
  • 福州最好的网站建设网络公司做网络推广一个月的收入
  • 门户网站建设主要内容新闻发布最新新闻
  • 做么网站有黄网游推广
  • 新年网页制作素材seo搜索引擎推广什么意思
  • 科技公司网站制作模板站长工具如何使用
  • 备案网站出售厦门人才网个人会员登录
  • 徐汇网站开发培训班百度关键词排名突然没了
  • 梧州建设厅官方网站怎样建网站
  • erp软件是什么班级优化大师功能介绍
  • 优秀网站案例欣赏账号权重查询入口
  • 服饰品牌网站建设百度获客
  • 做网站美工seo科技网
  • 网站建设公司找上海站霸百度推广代理商与总公司的区别
  • 怎样做电商网站的财务分析如何做平台推广赚钱
  • 网站流量达到多少磁力猫torrent kitty
  • wordpress首页字符画质优化app下载
  • ps可以做网站吗免费seo营销优化软件下载
  • 做网站应该会什么腾讯企点账户中心
  • 失物招领网站开发项目需求分析怎样做线上销售
  • 上海移动云网站建设快速收录工具
  • 做网站的企业文化怎么写做网站一般需要多少钱
  • 任丘市网站建设价格关键词排名优化
  • 石家庄seo代理商seo关键词推广公司
  • 做设计赚钱的网站张家口网站seo
  • 网业认证怎么认证济南网站万词优化
  • 郑州做网站的企业网络营销策划需要包括哪些内容
  • 营销型企业网站的含义海外seo