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

泊头那家做网站近期网络舆情事件热点分析

泊头那家做网站,近期网络舆情事件热点分析,门店充值会员卡系统,上海浦东网站建设公司MyBatis插件机制是该框架提供的一种灵活扩展方式,允许开发者在不修改框架源代码的情况下对MyBatis的功能进行定制和增强。这种机制主要通过拦截器(Interceptor)实现,使得开发者可以拦截和修改MyBatis在执行SQL语句过程中的行为。 …

MyBatis插件机制是该框架提供的一种灵活扩展方式,允许开发者在不修改框架源代码的情况下对MyBatis的功能进行定制和增强。这种机制主要通过拦截器(Interceptor)实现,使得开发者可以拦截和修改MyBatis在执行SQL语句过程中的行为。
在这里插入图片描述

MyBatis允许使用插件来拦截的方法调用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 拦截执行器的方法
  • ParameterHandler (getParameterObject, setParameters) 拦截参数的处理
  • ResultSetHandler (handleResultSets, handleOutputParameters) 拦截结果集的处理
  • StatementHandler (prepare, parameterize, batch, update, query) 拦截Sql语法构建的处理

拦截器介绍及配置

MyBatis拦截器的接口定义,plugin方法用于某些处理器(Handler)的构建过程。interceptor方法用于处理代理类的执行。setProperties方法用于拦截器属性的设置:

public interface Interceptor {Object intercept(Invocation invocation) throws Throwable;Object plugin(Object target);void setProperties(Properties properties);}

MyBatis默认没有一个拦截器接口的实现类。下面的MyBatis官网的一个拦截器实例,这个拦截器拦截Executor接口的update方法,所有执行executor的update方法都会被该拦截器拦截到:

@Intercepts({@Signature(type= Executor.class, method = "update", args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {public Object intercept(Invocation invocation) throws Throwable {return invocation.proceed();}public Object plugin(Object target) {return Plugin.wrap(target, this);}public void setProperties(Properties properties) {}
}
<plugins><plugin interceptor="org.format.mybatis.cache.interceptor.ExamplePlugin"></plugin>
</plugins>

源码分析

先从源头->配置文件开始分析:
XMLConfigBuilder解析MyBatis全局配置文件的pluginElement私有方法:

private void pluginElement(XNode parent) throws Exception {if (parent != null) {for (XNode child : parent.getChildren()) {String interceptor = child.getStringAttribute("interceptor");Properties properties = child.getChildrenAsProperties();Interceptor interceptorInstance = (Interceptor) resolveClass(interceptor).newInstance();interceptorInstance.setProperties(properties);configuration.addInterceptor(interceptorInstance);}}
}
public void addInterceptor(Interceptor interceptor) {interceptorChain.addInterceptor(interceptor);
}

InterceptorChain类包含一个Interceptor类型的列表,用于存储拦截器。类中有三个方法:pluginAll()用于将所有拦截器应用于目标对象:

public class InterceptorChain {private final List<Interceptor> interceptors = new ArrayList<Interceptor>();public Object pluginAll(Object target) {for (Interceptor interceptor : interceptors) {target = interceptor.plugin(target);}return target;}public void addInterceptor(Interceptor interceptor) {interceptors.add(interceptor);}public List<Interceptor> getInterceptors() {return Collections.unmodifiableList(interceptors);}}

一开始说的几种方法都会调用pluginAll:

public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql);parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler);return parameterHandler;}public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,ResultHandler resultHandler, BoundSql boundSql) {ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds);resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);return resultSetHandler;}public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);return statementHandler;}public Executor newExecutor(Transaction transaction) {return newExecutor(transaction, defaultExecutorType);}public Executor newExecutor(Transaction transaction, ExecutorType executorType) {...executor = (Executor) interceptorChain.pluginAll(executor);return executor;}

在这里插入图片描述
由于可以拦截StatementHandler,这个接口主要处理sql语法的构建,因此比如分页的功能,可以用拦截器实现,只需要在拦截器的plugin方法中处理StatementHandler接口实现类中的sql即可,可使用反射实现。

Plugin.wrap方法

Mybatis 中的 Plugin.wrap方法用于生成代理对象,实现对目标对象的增强。在 Mybatis 中,插件是通过动态代理实现的,而 Plugin.wrap方法就是用于创建代理对象的核心方法。
具体来说,Plugin.wrap方法接收两个参数:一个是目标对象(target),另一个是插件实例(plugin)。方法的主要作用是将插件实例和目标对象进行绑定,然后通过动态代理技术生成一个新的代理对象,该代理对象在调用目标对象的方法时,会先执行插件实例中对应的拦截方法(interceptor),从而实现对目标对象的功能增强。

public class Plugin implements InvocationHandler {
private Object target;// 被代理的目标类private Interceptor interceptor;// 对应的拦截器private Map<Class<?>, Set<Method>> signatureMap;// 拦截器拦截的方法缓存public static Object wrap(Object target, Interceptor interceptor) {Map<Class<?>, Set<Method>> signatureMap = getSignatureMap(interceptor);Class<?> type = target.getClass();Class<?>[] interfaces = getAllInterfaces(type, signatureMap);if (interfaces.length > 0) {return Proxy.newProxyInstance(type.getClassLoader(),interfaces,new Plugin(target, interceptor, signatureMap));}return target;}}

总结

如果开发者对MyBatis的内部工作原理理解不深,使用拦截器可能会意外改变底层行为,导致难以预料的问题。当使用多个拦截器时,需要仔细管理它们的执行顺序,以确保它们按预期顺序应用,这增加了管理复杂性。同时在编写插件时需注意以下几个原则:

  • 不编写不必要的插件
  • 实现plugin方法时判断一下目标类型,是本插件要拦截的对象才执行Plugin.wrap方法,否则直接返回,这样可以减少目标被代理的次数。
http://www.tj-hxxt.cn/news/20934.html

相关文章:

  • 网站备案期间做什么宁波网络推广联系方式
  • wordpress 网站标题设置孝感seo
  • 分类目录网站程序seo优化设计
  • 企业网站设计郑州seo方案
  • 网站开发 在线支付爱站网爱情电影网
  • 北京展示型网站建设价格如何推广自己的店铺?
  • 专门做卫生间效果图的网站佛山百度关键词排名
  • 给做网站公司写锦旗语百度门店推广
  • 天津市网站建设seo网站优化推荐
  • 展馆公司百度seo建议
  • wordpress amp改成mip百度推广账户优化方案
  • 邯郸移动网站建设报价产品代理推广方案
  • 做网站需要哪方面的编程网站外链购买
  • 手机app下载软件上海专业的seo公司
  • 网站打开404错误怎么解决软文是什么文章
  • 做网站用哪个服务器一点优化
  • 网站上怎么做动画广告视频下载百度精准获客平台
  • 招聘网站系统怎么做百度关键词关键词大全
  • 临朐网站建设百度平台订单查询
  • 网站架设建设百度推广优化师培训
  • 邹带芽在成武建设局网站软文客
  • php怎样做网站的注删页面企业微信会话内容存档
  • b站免费推广app大全营销推广方案案例
  • 精品网站要建设需要多少钱seo排名赚钱
  • 网站建设心得体会800字seo优化的内容有哪些
  • 做网站让人来注册百度竞价关键词怎么优化
  • 新像素ui设计学费百度百科优化排名
  • wordpress怎么做企业网站如何制作网址
  • 如何更改asp网站自定义产品顺序百度竞价广告怎么投放
  • 公司做网站的申请营销型网站建设运营