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

建设部建造师网站重庆网站设计公司

建设部建造师网站,重庆网站设计公司,wordpress的主机要求,怎样做app网站建设拦截器的作用就是我们可以拦截某些方法的调用#xff0c;在目标方法前后加上我们自己逻辑 Mybatis拦截器设计的一个初衷是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑。 mybatis 自定义拦截器 1、实现Interceptor 接口#xff0c;并添加拦截注解 I…拦截器的作用就是我们可以拦截某些方法的调用在目标方法前后加上我们自己逻辑 Mybatis拦截器设计的一个初衷是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑。 mybatis 自定义拦截器 1、实现Interceptor 接口并添加拦截注解 Intercepts2、配置文件中添加拦截器 1、实现Interceptor 接口并添加拦截注解 Intercepts mybatis 拦截器默认可拦截的类型只有四种 Executor拦截执行器的方法。ParameterHandler拦截参数的处理。ResultHandler拦截结果集的处理。StatementHandler拦截Sql语法构建的处理。 对于我们的自定义拦截器必须使用 mybatis 提供的注解来指明我们要拦截的是四类中的哪一个类接口具体规则如下 aIntercepts 拦截器: 标识我的类是一个拦截器bSignature 署名: 则是指明我们的拦截器需要拦截哪一个接口的哪一个方法 type 对应四类接口中的某一个比如是 Executormethod 对应接口中的哪类方法比如 Executor 的 update 方法args 对应接口中的哪一个方法比如 Executor 中 query 因为重载原因方法有多个args 就是指明参数类型从而确定是哪一个方法 Intercepts({Signature(method update, type Executor.class, args {MappedStatement.class, Object.class}),Signature(method query, type StatementHandler.class, args {Statement.class, ResultHandler.class}) }) public class MyInterceptor implements Interceptor {/*** 这个方法很好理解* 作用只有一个我们不是拦截方法吗拦截之后我们要做什么事情呢* 这个方法里面就是我们要做的事情** 解释这个方法前我们一定要理解方法参数 {link Invocation} 是个什么鬼* 1 我们知道mybatis拦截器默认只能拦截四种类型 Executor、StatementHandler、ParameterHandler 和 ResultSetHandler* 2 不管是哪种代理代理的目标对象就是我们要拦截对象举例说明* 比如我们要拦截 {link Executor#update(MappedStatement ms, Object parameter)} 方法* 那么 Invocation 就是这个对象Invocation 里面有三个参数 target method args* target 就是 Executor* method 就是 update* args 就是 MappedStatement ms, Object parameter** 如果还是不能理解我再举一个需求案例看下面方法代码里面的需求** 该方法在运行时调用*/Overridepublic Object intercept(Invocation invocation) throws Throwable {/** 需求我们需要对所有更新操作前打印查询语句的 sql 日志* 那我就可以让我们的自定义拦截器 MyInterceptor 拦截 Executor 的 update 方法在 update 执行前打印sql日志* 比如我们拦截点是 Executor 的 update 方法 int update(MappedStatement ms, Object parameter)** 那当我们日志打印成功之后我们是不是还需要调用这个query方法呢如何如调用呢* 所以就出现了 Invocation 对象它这个时候其实就是一个 Executor而且 method 对应的就是 query 方法我们* 想要调用这个方法只需要执行 invocation.proceed()*//* 因为我拦截的就是Executor所以我可以强转为 Executor默认情况下这个Executor 是个 SimpleExecutor */Executor executor (Executor)invocation.getTarget();/** Executor 的 update 方法里面有一个参数 MappedStatement它是包含了 sql 语句的所以我获取这个对象* 以下是伪代码思路* 1 通过反射从 Executor 对象中获取 MappedStatement 对象* 2 从 MappedStatement 对象中获取 SqlSource 对象* 3 然后从 SqlSource 对象中获取获取 BoundSql 对象* 4 最后通过 BoundSql#getSql 方法获取 sql*/MappedStatement mappedStatement ReflectUtil.getMethodField(executor, MappedStatement.class);SqlSource sqlSource ReflectUtil.getField(mappedStatement, SqlSource.class);BoundSql boundSql sqlSource.getBoundSql(args);String sql boundSql.getSql();logger.info(sql);/** 现在日志已经打印需要调用目标对象的方法完成 update 操作* 我们直接调用 invocation.proceed() 方法* 进入源码其实就是一个常见的反射调用 method.invoke(target, args)* target 对应 Executor对象* method 对应 Executor的update方法* args 对应 Executor的update方法的参数*/return invocation.proceed();}/*** 这个方法也很好理解* 作用就只有一个那就是Mybatis在创建拦截器代理时候会判断一次当前这个类 MyInterceptor 到底需不需要生成一个代理进行拦截* 如果需要拦截就生成一个代理对象这个代理就是一个 {link Plugin}它实现了jdk的动态代理接口 {link InvocationHandler}* 如果不需要代理则直接返回目标对象本身** Mybatis为什么会判断一次是否需要代理呢* 默认情况下Mybatis只能拦截四种类型的接口Executor、StatementHandler、ParameterHandler 和 ResultSetHandler* 通过 {link Intercepts} 和 {link Signature} 两个注解共同完成* 试想一下如果我们开发人员在自定义拦截器上没有指明类型或者随便写一个拦截点比如Object那Mybatis疯了难道所有对象都去拦截* 所以Mybatis会做一次判断拦截点看看是不是这四个接口里面的方法不是则不拦截直接返回目标对象如果是则需要生成一个代理** 该方法在 mybatis 加载核心配置文件时被调用*/Overridepublic Object plugin(Object target) {/** 看了这个方法注释就应该理解这里的逻辑只有一个就是让mybatis判断要不要进行拦截然后做出决定是否生成一个代理** 下面代码什么鬼就这一句就搞定了* Mybatis判断依据是利用反射获取这个拦截器 MyInterceptor 的注解 Intercepts和Signature然后解析里面的值* 1 先是判断要拦截的对象是四个类型中 Executor、StatementHandler、ParameterHandler、 ResultSetHandler 的哪一个* 2 然后根据方法名称和参数(因为有重载)判断对哪一个方法进行拦截 Notemybatis可以拦截这四个接口里面的任一一个方法* 3 做出决定是返回一个对象呢还是返回目标对象本身(目标对象本身就是四个接口的实现类我们拦截的就是这四个类型)** 好了理解逻辑我们写代码吧~~~ What !!! 要使用反射然后解析注解然后根据参数类型最后还要生成一个代理对象* 我一个小白我怎么会这么高大上的代码嘛怎么办** 那就是使用下面这句代码吧 哈哈* mybatis 早就考虑了这里的复杂度所以提供这个静态方法来实现上面的逻辑*/return Plugin.wrap(target, this);}/*** 这个方法最好理解如果我们拦截器需要用到一些变量参数而且这个参数是支持可配置的* 类似Spring中的Value(${})从application.properties文件获取* 这个时候我们就可以使用这个方法** 如何使用* 只需要在 mybatis 配置文件中加入类似如下配置然后 {link Interceptor#setProperties(Properties)} 就可以获取参数* plugin interceptorliu.york.mybatis.study.plugin.MyInterceptor* property nameusername valueLiuYork/* property namepassword value123456/* /plugin* 方法中获取参数properties.getProperty(username);** 问题为什么要存在这个方法呢比如直接使用 Value(${}) 获取不就得了* 原因是 mybatis 框架本身就是一个可以独立使用的框架没有像 Spring 这种做了很多依赖注入的功能** 该方法在 mybatis 加载核心配置文件时被调用 */Overridepublic void setProperties(Properties properties) {String username properties.getProperty(username);String password properties.getProperty(password);// TODO: 2019/2/28 业务逻辑处理...} }三个核心方法都加了详细的注释而且结合案例需求说明问题 那么多文字不想行看,没关系有概括 总结: 1.在mybatis中可被拦截的类型有四种(按照拦截顺序) Executor拦截执行器的方法。 ParameterHandler拦截参数的处理。 ResultHandler拦截结果集的处理。 StatementHandler拦截Sql语法构建的处理。2.各个参数的含义 Intercepts标识该类是一个拦截器 Signature指明自定义拦截器需要拦截哪一个类型哪一个方法2.1 type对应四种类型中的一种2.2 method对应接口中的哪个方法2.3 args对应哪一个方法参数类型因为可能存在重载方法接下来我们看看 Plugin 类 package org.apache.ibatis.plugin;/*** Plugin 类其实就是一个代理类因为它实现了jdk动态代理接口 InvocationHandler* 我们核心只需要关注两个方法* wrap* 如果看懂了代码案例1的例子那么这个方法很理解这个方法就是 mybatis 提供给开发人员使用的一个工具类方法* 目的就是帮助开发人员省略掉 反射解析注解 Intercepts 和 Signature有兴趣的可以去看看源码 Plugin#getSignatureMap 方法** invoke* 这个方法就是根据 wrap 方法的解析结果判断当前拦截器是否需要进行拦截* 如果需要拦截将 目标对象目标方法目标参数 封装成一个 Invocation 对象给我们自定义的拦截器 MyInterceptor 的 intercept 方法* 这个时候就刚好对应上了上面案例1中对 intercept 方法的解释了它就是我们要处理自己逻辑的方法* 处理好了之后是否需要调用目标对象的方法比如上面说的 打印了sql语句是否还要查询数据库呢答案是肯定的* 如果不需要拦截则直接调用目标对象的方法* 比如直接调用 Executor 的 update 方法进行更新数据库**/ class Plugin implements InvocationHandler {public static Object wrap(Object target, Interceptor interceptor) {// 省略}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 省略} }贴一段网上的通用解释吧 Plugin的wrap方法它根据当前的Interceptor上面的注解定义哪些接口需要拦截然后判断当前目标对象是否有实现对应需要拦截的接口如果没有则返回目标对象本身如果有则返回一个代理对象。而这个代理对象的InvocationHandler正是一个Plugin。所以当目标对象在执行接口方法时如果是通过代理对象执行的则会调用对应InvocationHandler的invoke方法也就是Plugin的invoke方法。所以接着我们来看一下该invoke方法的内容。这里invoke方法的逻辑是如果当前执行的方法是定义好的需要拦截的方法则把目标对象、要执行的方法以及方法参数封装成一个Invocation对象再把封装好的Invocation作为参数传递给当前拦截器的intercept方法。如果不需要拦截则直接调用当前的方法。Invocation中定义了定义了一个proceed方法其逻辑就是调用当前方法所以如果在intercept中需要继续调用当前方法的话可以调用invocation的procced方法。 这就是Mybatis中实现Interceptor拦截的一个思想 2、在配置文件中添加拦截器 在springboot中要给mybatis加上这个拦截器有三种方法前两种方法在启动项目时不会自动调用自定义拦截器的setProperties方法。 拦截器顺序 1、不同拦截器顺序 Executor - ParameterHandler - StatementHandler - ResultSetHandler 2、对于同一个类型的拦截器的不同对象拦截顺序 在 mybatis 核心配置文件根据配置的位置拦截顺序是 从上往下 1第一种 直接给自定义拦截器添加一个 Component注解当调用sql时结果如下可以看到拦截器生效了但是启动时候并没有自动调用setProperties方法。 Component Intercepts({ Signature(type Executor.class, method update, args { MappedStatement.class, Object.class }) }) public class MybatisInterceptor implements Interceptor {Overridepublic Object intercept(Invocation invocation) throws Throwable {//业务代码}Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}Overridepublic void setProperties(Properties properties) {// TODO Auto-generated method stub}}2第二种 在配置类里添加拦截器这种方法结果同上也不会自动调用setProperties方法。 Configuration public class MybatisConfig {Beanpublic ConfigurationCustomizer mybatisConfigurationCustomizer() {return new ConfigurationCustomizer() {Overridepublic void customize(Configuration configuration) {configuration.addInterceptor(new MybatisInterceptor());}};} }3第三种 这种方法就是跟以前的配置方法类似在yml配置文件中指定mybatis的xml配置文件, 注意config-location属性和configuration属性不能同时指定 mybatis:config-location: classpath:mybatis.xmltype-aliases-package: me.zingon.pagehelper.modelmapper-locations: classpath:mapper/*.xmlmybatis.xml ?xml version1.0 encodingUTF-8 ? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd configurationtypeAliasespackage nameme.zingon.pacargle.model//typeAliasespluginsplugin interceptorme.zingon.pagehelper.interceptor.MyPageInterceptor property namedialect valueoracle//plugin/plugins /configuration可以看到在启动项目的时候setProperties被自动调用了 总结前两种方法可以在初始化自定义拦截器的时候通过 Value 注解直接初始化需要的参数。
http://www.w-s-a.com/news/48247/

相关文章:

  • 网站的文件夹建设企业网站公积金
  • 做网站的的价位网站建设 考试题目
  • 深圳比邻网站建设北京优化服务
  • 菏泽网站建设哪家好电子商务网络安全
  • 仿一个网站广州网站建设正规公司
  • 网站建设 目的seo网站关键词排名快速
  • 什么叫做响应式网站自媒体全平台发布
  • 企业网站 案例哪里需要人做钓鱼网站
  • 厚街东莞网站建设网站开发者调试模式
  • 网站推广营销联系方式wordpress adminlte
  • 哪些网站可以做文字链广告卖水果网站建设的策划书
  • 雕刻业务网站怎么做企业qq官网
  • 新华书店的做的数字阅读网站wordpress编辑器格式
  • jq做6个网站做什么好广西临桂建设局网站
  • 网站新闻图片尺寸南京网站设计公司
  • 重庆seo建站网站服务器 安全
  • 咸宁做网站的公司桂林网站建设兼职
  • 教做网站网站开发行业分析
  • 忻州网站建设培训友情链接交换形式有哪些
  • 佛山做外贸网站渠道外贸常用网站
  • 文章收录网站网站及新媒体建设办法
  • 招聘网站排行榜2021找建网站公司
  • 网站建设制作宝塔面板活动宣传推广的形式有哪些
  • 掉关键词网站敏捷软件开发流程
  • 微信小程序格泰网站建设新闻采编与制作专业简历
  • 电子商城建设网站海伦网站建设
  • 南充能够建设网站的公司有专门做设计的一个网站
  • 免费域名申请个人网站阿里巴巴运营的工作内容
  • 怎么建自己的手机网站保定电子商务网站建设
  • 系部网站建设中期检查表创建网站的公司