做软件赚钱的网站php中网站不同模板后台逻辑代码怎么管理

news/2025/9/28 2:46:31/文章来源:
做软件赚钱的网站,php中网站不同模板后台逻辑代码怎么管理,做php网站用什么软件好,免费做app的软件有哪些文章目录前言InterceptorChain保存所有的Interceptor创建四大对象都走ConfigurationInterceptorChain增强对象方法Plugin封装动态代理#xff0c;让你使用Mybatis拦截器更简单Invocation#xff0c;让我们能在拦截器中使用动态代理类中的invoke方法中的对象调用时序图小结前言… 文章目录前言InterceptorChain保存所有的Interceptor创建四大对象都走ConfigurationInterceptorChain增强对象方法Plugin封装动态代理让你使用Mybatis拦截器更简单Invocation让我们能在拦截器中使用动态代理类中的invoke方法中的对象调用时序图小结前言 mybatis拦截器是一个非常有用的功能当你想实现自动分页自动记录执行的sql等功能时若在service层每次调用时都写代码的话会非常麻烦而使用mybatis拦截器就可以非常轻松的实现了。 Executor , ResultSetHandler,StatementHandler,ParameterHandler,这是Mybatis中的四大对象也是拦截器的切入点。我们可以基于这四大对象的方法进行增强。解释一下因为这四个都是接口我们可以利用动态代理进行方法的增强。 动态代理这是底层的原理若只用了动态代理那么你肯定要自己写代理类在使用的时候实例化然后再替换Mybatis里面的原有对象对不但是实际你并不需要这么做那是因为mybatis一开始就为你设计好了让你如何简单快速的添加拦截器让你在添加拦截器的时候只用关注业务逻辑而不需要管类之间的关系。 那么Mybatis究竟是怎么做到这一点的呢接下来就让LZ带大家来看看Mybatis究竟是如何实现的吧。 我们实现mybatis拦截器的步骤首先创建Interceptor的实现类然后我们要在mybatis.xml中配置plugins这就是我们为Mybatis添加拦截器的步骤。 InterceptorChain保存所有的Interceptor 我们来到Configuration类中看到里面他有个属性叫InterceptorChain,里面是用来存放我们的所有拦截器针对四大对象的拦截器全部在里面。 //这里就是解析并把plugin加入到interceptorChain中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);}}}//加入到interceptorChainpublic void addInterceptor(Interceptor interceptor) {interceptorChain.addInterceptor(interceptor);}创建四大对象都走Configuration 然后Mybatis在创建四大对象的时候都是走的Configuration类中的方法 //创建ParameterHandler对象public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {ParameterHandler parameterHandler mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql);//都有interceptorChain.pluginAll()parameterHandler (ParameterHandler) interceptorChain.pluginAll(parameterHandler);return parameterHandler;} //创建ResultSetHandler对象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);//都有interceptorChain.pluginAll()resultSetHandler (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);return resultSetHandler;} //创建StatementHandler对象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);//都有interceptorChain.pluginAll()statementHandler (StatementHandler) interceptorChain.pluginAll(statementHandler);return statementHandler;} //创建Executor对象public Executor newExecutor(Transaction transaction, ExecutorType executorType) {executorType executorType null ? defaultExecutorType : executorType;executorType executorType null ? ExecutorType.SIMPLE : executorType;Executor executor;if (ExecutorType.BATCH executorType) {executor new BatchExecutor(this, transaction);} else if (ExecutorType.REUSE executorType) {executor new ReuseExecutor(this, transaction);} else {executor new SimpleExecutor(this, transaction);}if (cacheEnabled) {executor new CachingExecutor(executor);}//都有interceptorChain.pluginAll()executor (Executor) interceptorChain.pluginAll(executor);return executor;}观察上面的四个函数他们都有一个共有的点调用了interceptorChain.pluginAll()方法这也是Mybatis实现拦截器功能的中点这个pluginAll使拦截器有了一个特性那就是逻辑可以向下传递是责任链模式。 InterceptorChain增强对象方法 public class InterceptorChain {private final ListInterceptor interceptors new ArrayListInterceptor();public Object pluginAll(Object target) {//通过for循环遍历interceptors将所有的interceptor都加进去。//一层包一层直到所有的interceptor都包装好for (Interceptor interceptor : interceptors) {target interceptor.plugin(target);}return target;}public void addInterceptor(Interceptor interceptor) {interceptors.add(interceptor);}public ListInterceptor getInterceptors() {return Collections.unmodifiableList(interceptors);}}这里进去的对象和出来的对象已经不是同一个了。进去的基础四大对象出来的是增强版四大对象。 这里其实用到了责任链模式每个Interceptor 都有自己要服务的对象只有当请求的方法和Interceptor要服务的对象匹配时它才会执行你拦截器里的方法。 接下来LZ带大家来看看Mybatis是怎么比对两个对象是否匹配的。 Plugin封装动态代理让你使用Mybatis拦截器更简单 我们去Plugin类中 //看到这个类大家有没有觉得很熟悉没错实现了InvocationHandler 使用动态代理 //这个就是Mybatis实现拦截器功能的底层。 public class Plugin implements InvocationHandler {private Object target;private Interceptor interceptor;private MapClass?, SetMethod signatureMap;private Plugin(Object target, Interceptor interceptor, MapClass?, SetMethod signatureMap) {this.target target;this.interceptor interceptor;this.signatureMap signatureMap;} //我们不需要手动的实例化动态代理对象是因为wrap为我们做了这件事public static Object wrap(Object target, Interceptor interceptor) {//这句也蛮重要的是将我们写的拦截器类的注解转换成了mapkey为我们的类对象value是方法//为了之后判断是否需要执行拦截器的方法//这句就不进去仔细分析了因为很简单就是解析注解而已MapClass?, SetMethod signatureMap getSignatureMap(interceptor);Class? type target.getClass();Class?[] interfaces getAllInterfaces(type, signatureMap);//这里实例了动态代理对象 return interfaces.length 0 ? Proxy.newProxyInstance(type.getClassLoader(), interfaces, new Plugin(target, interceptor, signatureMap)) : target;} }public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {try {//获得方法SetMethod methods (Set)this.signatureMap.get(method.getDeclaringClass());//如果方法不为空说明这个对象确实有拓展拦截器之后看method是不是有这个方法有的话才说明这个方法确实被拓展了之后执行interceptor.intercept()即调用拦截器的方法return methods ! null methods.contains(method) ? this.interceptor.intercept(new Invocation(this.target, method, args)) : method.invoke(this.target, args);} catch (Exception var5) {throw ExceptionUtil.unwrapThrowable(var5);}}Invocation让我们能在拦截器中使用动态代理类中的invoke方法中的对象 //通过这个对象把代理类中的invoke方法中的对象和我们拦截器类相连。 //我们在拦截器类中的intercept(Invocation invocation)中的invocation就是这个类型 //所以我们就能在拦截器类中获取到代理类中的各个对象啦 public class Invocation {private Object target;private Method method;private Object[] args;public Invocation(Object target, Method method, Object[] args) {this.target target;this.method method;this.args args;}public Object getTarget() {return target;}public Method getMethod() {return method;}public Object[] getArgs() {return args;}public Object proceed() throws InvocationTargetException, IllegalAccessException {return method.invoke(target, args);}}调用时序图 小结 总结一下其实底层用到的还是动态代理但是Mybatis通过封装让我们开发拦截器更加简单。通过InterceptorChain使得拦截器能将逻辑向下传递然后通过Invocation让拦截器类能使用到动态代理类invoke中的对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基层建设 官方网站WordPress潮流媒体主题

在/ l o g s目录中查找更改时间在7日以前的文件并删除它们: $ find logs/ -type f -mtime 7 -exec rm -f {} \; 在/ l o g s目录中查找更改时间在7日以内的文件并删除它们: $ find logs/ -type f -mtime -7 -exec rm -f {} \; 然后加入的计划任务中每日执…

大连做网站不错的公司信息管理网站开发实验体会

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:横向菜单高级交互 主要内容:横向菜单左右拖动、选中效果 应用场景:app横向菜单、pc后台动态区域 案例展示: 演…

企业网站源码哪个最好暖色网站

IdentityServer4是什么?IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现。OpenID Connect 和 OAuth2.0是什么OpenID Connect:OpenID Connect由OpenID基金会于2014年发布的一个开放标准, 是建立在OAuth …

沧州网站建设方案咨询万网主机建wordpress

作者:朱金灿 来源:http://blog.csdn.net/clever101/ 同事问我一个奇怪的问题:程序在他的机子上运行的好好的,但是其它人下载了源码之后可以编译通过,但是debug模式下调试运行到应用程序类中的InitInstance函数中的 i…

做网站收录的网站有哪些自己在线制作logo免费广告招牌

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统物流配送人员车辆调度信息管理难度大,容错率低…

网页设计公司建设网站小程序网站app定制开发

美国股市昨日先抑后扬终结两连跌,开启反弹,道指、标普、纳指纷纷翻红。10月3日晚,美东时间周四,美股集体低开,盘初受宏观经济数据不及预期影响,三大指数大幅跳水跌逾1%,道指跌超300点。此后美股…

给喻家山下的投稿

给喻家山下的投稿隔山隔海回头望,最远最近是家乡。——《天知河》【图1:归途】 常常是在傍晚悄然离开,在摇摇晃晃的睡梦里穿越中原大地。醒来望向窗外,自己已然回到久违的华北平原——朦胧的天色里,平坦,辽阔,一…

什么网站可以自己做名片logo设计文案范例

解决问题的过程:1)查看服务器CPU使用情况输入top会发现排在前面的都是oracle的进程,而且CPU占用率都是50以上。$toptop - 16:28:41 up 4 days, 22:35, 1 user, load average: 21.49, 22.14, 22.05Tasks: 299 total, 31 running, 268 sleeping, 0 st…

网站首页的head标签内湖南室内设计公司排名

这篇文章,主要介绍Vue3项目工程中如何使用axios网络请求库实现前后端数据通信【知识星球】。 目录 一、axios依赖 1.1、下载axios依赖 1.2、创建axios工具类

经典企业网站模板青岛网站公司

注:这是一篇没有技术含量的水文,主要是看有人下载下来,居然当成资源需要积分才能下载。我觉得不行,故提供原始下载地址供查阅使用。 链接: 上述图片所示网址:链接直达

上海网站设计厂家考试培训

文章目录 一、MySQL和Oracle1.1 基本差别1.2 使用区别 二、MySQL和PostgreSQL2.1 基本差别2.2 使用差别 本系列文章: MySQL(一)SQL语法、数据类型、常用函数、事务 MySQL(二)MySQL SQL练习题 MySQL(三&…

有哪些免费推广网站网站建设用到什么

参展企业介绍 山东润德生物科技有限公司成立于2014年10月17日,是一家围绕生物制品的研发、生产、营销、国际贸易、技术服务为核心业务的国家高新技术企业,近年来荣获国家制造业单项冠军示范企业、国家级绿色工厂、国家知识产权优势企业、国家工业产品绿…

网站设计网站维护dedecms 食品网站模板

目录 一、C语言的语句有哪些 1.1 空语句 1.2 表达式语句 1.3 函数调用语句 1.4 复合语句 1.5 控制语句 二、分支语句(两种) 1.1 if语句 1.1.1 普通分支语句(if、if_else) 1.1.2 嵌套if语句 1.1.3 else嵌套if两种写法的比较 1.1.4 else悬空问题 1.1.…

找做企业网站周口市城乡建设局网站

函数进阶 函数进阶1.参数的补充1.1 参数内存地址相关【面试题】1.2 函数的返回值是内存地址1.3 参数的默认值【面试题】1.4 动态参数 2. 函数和函数名2.1 函数做元素2.2 函数名赋值2.3 函数名做参数和返回值 3.返回值和print4. 作用域4.1 函数为作用域4.2 全局和局部4.3 global…

维生素D,毛姆,我,还有停滞的3年

好久没写博文了,想把最近的一些想法post在这里。 今年11月中旬之后,就满26岁了,而且毕业3年,自己的工作没啥进展。有些怀疑自己是不是不太适合这个岗位,没给我太多成就感。 直到我的身体“宕机”了。 从大四实习结…

唐山地方志网站建设重庆网络推广培训

【力扣】416. 分割等和子集 给你一个 只包含正整数的非空数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5,…

南昌seo网站推广西充建设局网站

import java.util.ArrayList; import java.util.Iterator;/*** ArrayList单列集合的简单使用常见方法** author silence* 单列 :一次只能存储一个数据元素 list.add("张三"); 不像map集合可以存储一个键值对,两个元素 map.put("张三&quo…

商服网站模板成都市住房和城乡建设局

Git 标签功能允许开发者为特定的提交打上标签,以便后续能够方便地引用这些提交。标签通常用于标记重要的版本或里程碑,例如软件发布的版本号。与分支不同,标签指向的是固定的提交,一旦设置,就不能轻易更改。下面是一些…

局网站建设管理制度福州网站建设找时时在网络

引言: 在数字化时代,机房成为了许多组织和企业的核心基础设施,承载着重要的数据和应用。然而,随着网络攻击日益猖獗,机房的安全性显得尤为重要。本文将深入探讨如何构建坚固的网络防线,保护机房免受攻击的方…

平台网站建设合同清华紫光是可以做网站的吗

指在JSP的<%%> 和<% %>中可以直接使用的对象&#xff1a;没有特别说明可以开关的默认是开启的 一servlet理论上可以处理多种形式的请求响应形式http只是其中之一所以HttpServletRequest HttpServletResponse分别是ServletRequest和ServletResponse的之类 二 Http…