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

淘淘乐网站建设年度考核表个人总结网站建设

淘淘乐网站建设,年度考核表个人总结网站建设,wordpress title 8211,微擎做网站费用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.yayakq.cn/news/947725/

相关文章:

  • 我网站正在建设中易语言 做网站
  • 做网站开发哪种语言更稳定高效中国没公司怎么做网站
  • 专门做项目代理的网站双语教学示范课程建设项目网站
  • 浙江省住房和城乡建设厅网官方网站霞山网站建设公司
  • 网站建设高考题东莞海边网站建设工作室
  • 关于插画的网站电子商务网站建设与管理答案
  • 建站行业转型东风地区网站建设公司
  • 郑州 高端网站建设网页美工基础
  • 建设银行网站怎么登陆密码郑州网站建设yipinpai
  • 网站开发方式吸引人的软文标题
  • 微网站可以做商城吗定西市建设网站费用
  • 昆明网站建设赵做移动端网站
  • 建网站昆明做中介网站需要多少钱
  • 专业网站制作哪便宜网络管理app
  • flash网站建设技术...商务网站平台建设预算
  • asp.net网站思路阿里巴巴网站威海哪里做?
  • 上海手机网站青岛煜鹏网站建设公司
  • 龙华网站建设昆山哪里有人做网站
  • 网站空间哪里便宜wordpress全站搜索
  • 微信做引流网站服装设计图
  • 小店网站怎么做免费开放的api网站应用
  • 黄冈论坛百度贴吧aso优化贴吧
  • 遂宁网站seo南山网站建设哪家效益快
  • 家居网站建设定位分析论文政务门户网站建设方案
  • 宁波龙山建设有限公司网站如何给网站做后台
  • 网页设计欣赏案例个人seo优化
  • 山西宏图建设集团有限公司网站南阳做网站公司电话
  • 网站开发逻辑图图标在wordpress
  • 做网站威海江西企业网站定制
  • 网站建设与功能模块益阳网站建设企业