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

推荐佛山顺德网站建设手机网站建设域名空间

推荐佛山顺德网站建设,手机网站建设域名空间,重庆建设网站的公司简介,关于花卉的网站怎么做插件原理与开发 在 Mybatis总体执行流程 一文中简单的介绍了插件的初始化过程#xff0c;本文将从源码的角度介绍一下mybatis的插件原理与简单开发实战。 插件原理 插件的注册和管理是通过InterceptorChain进行的#xff0c;在创建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是要拦截的接口方法集合MapClass?, SetMethod 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 {// 拿到被拦截的接口方法集合SetMethod 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);}}插件开发 自定义插件需要 实现Interceptor接口重写intercept方法 使用Intercepts和Signature注解表明需要拦截哪些类的哪些方法 在配置文件中添加插件配置 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;} }配置文件添加插件 !-- 配置插件 --pluginsplugin interceptorcom.qxf.plugin.SqlLogPlugin/plugin/plugins配置之后会打印执行的SQL语句及其耗时。
http://www.w-s-a.com/news/521059/

相关文章:

  • 电子商务网站建设策划书例子企业官网用什么cms系统
  • 网站栏目设计怎么写平面设计接单报价表
  • 做网站美工要学什么网站推广的方法包括
  • 哪个网站可以做笔译兼职wordpress加表单
  • 百度站内搜索 wordpress微餐饮建站费用
  • 用什么做网站的访问量统计制作手工作品
  • 微信公众号搭建网站河南卫生基层系统网站建设
  • steam账号注册网站重庆手机版建站系统哪家好
  • 中新生态城建设局门户网站wordpress云盘视频播放
  • 大型网站开发基本流程wordpress记录用户搜索
  • 云服务器安装win系统做网站wordpress边栏扩大尺寸
  • 网站开发面试自我介绍软件下载网站如何建设
  • 可以做翻译任务的网站陕西省建设厅八大员证
  • 昆明 网站推广重庆网页优化seo公司
  • 网站排名下降怎么上去设计一套app页面多少钱
  • 专门用来查找网址的网站查公司名字是否被注册
  • 自己创建网站教程河南省建设厅官方网站李学军
  • 一个网站需要多少容量怎样免费设计网站建设
  • 建设工程交易中心网站12306的网站是哪个公司做的
  • 建设网站经营范围自己给公司做网站
  • 河北省住房建设厅政务网站网络营销推广的岗位职责有哪些
  • 上海网站建设优化价格孝义做网站的公司
  • 哪个公司网站做的最好义乌 网站 制作
  • 百度站长工具综合查询wordpress 上传pdf
  • 旅游短租公寓网站建设深圳龙岗招聘网
  • 做海淘是在哪个网站网络查控系统设计方案
  • o2o网站建设代理商微信公众号开发文档
  • 网站设计课程总结关于网站备案的公告
  • 网站建设与运营意义到哪查找网站域名
  • 网站及单位网站建设情况眉县住房和城市建设局网站