问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

30.MyBatis插件原理与Spring集成

发布网友 发布时间:2024-10-04 12:30

我来回答

1个回答

热心网友 时间:2024-12-02 22:34

编写插件

编写*类,以PageHelper为例

1)实现Interceptor接口

2)实现方法。intercept就是拦截方法,增强代码写里面。

3)在*类上加上参数。注解签名注明拦截对象、拦截方法、拦截方法参数。

下面拦截Executor中的两个query方法。

插件配置

在mybatis-config.xml注册插件,配置属性

解析注册插件

myBatis启动时扫描标签,注册到Configuration对象的InterceptorChain中。通过setProperties将参数放到property里。

XMLConfigBuilder类

解析时将所有插件存到Configuration的InterceptorChain中,它是list类型。

不修改代码怎么增强功能?

代理模式,myBatis插件实现原理

多个插件怎么拦截?

责任链模式,链路执行,层层拦截。

什么对象可以被拦截?

有哪些对象和方法可以被拦截?

下面两张图:Executor有可能被二级缓存装饰。

Executor会拦截CachingExecutor或BaseExecutor。

DefaultSqlSessionFactory.openSessionFromDataSource():先创建基本类型,再二级缓存装饰,最后插件拦截。所以拦截的是CachingExecutor。

代理模式,需要解决的问题:1.代理类怎么创建?2.什么时候创建?3.调用流程什么样?

代理类什么时候创建?Executor拦截代理类是openSession时创建。

怎么创建?遍历InterceptorChain,使用Interceptor实现类的plugin方法,对目标对象进行代理。

这个plugin方法是自己实现的,返回一个代理对象。

JDK动态代理,需要实现InvocationHandler接口触发管理类。

用Proxy.nexProxyInstance创建对象。

myBatis插件机制将这些类封装好了,提供了一个触发管理类Plugin,实现了InvocationHandler。

创建代理对象的newProxyInstance方法也进行了封装,就是wrap。

被代理后的调用流程:先触发管理类Plugin的invoke方法

如果被拦截方法不为空,进入Plugin的invoke方法,调用interceptor的intercept方法,到我们自己实现的拦截逻辑。

new Invocation(target, method, args) 对象是对被拦截对象、方法、参数的封装。

被代理对象执行它的方法从Invocation对象拿。

配置顺序与执行顺序?配置与执行顺序是相反的。InterceptorChain从上往下添加,执行从最后开始。

总结:配置顺序与执行顺序?配置与执行顺序是相反的。InterceptorChain从上往下添加,执行从最后开始。

PageHelper原理:翻页使用RowBounds翻页,在内存中筛选数据。使用PageInterceptor*类。先判断是否需要count获得总数,默认true。获得count后,判断是否需要分页,如果pageSize>0,就分页。通过getPageSql方法生成新BoundSql:实际是添加了LIMIT语句,加上了起始与结束。

插件是如何获取页码和每页数量?PageHelper.startPage方法,调用了PageMethod的setLocalPage方法,包装了一个Page对象,并且把对象放到ThreadLocal中。AbstractHelperDialect中,Page对象中的翻页信息是通过getLocalPage()取出的:调的就是PageHelper的getLocalPage,从ThreadLocal中获取到。每次查询(每个线程)都有线程私有Page对象,里面有页码和每页数量。

应用场景分析:与Spring 整合分析

关键配置:pom依赖,出了mybatis依赖,还需要mys和spring整合包。叫mybatis-spring。版本要对应。SqlSessionFactoryBean在applicationContext.xml配置这个类。这个Bean会初始化SqlSessionFactory,用来创建SqlSession。属性要指定mybatis-config.xml和Mapper映射器文件。SqlSessionFactoryBean在哪创建?SqlSession在哪创建?代理类在哪创建?

创建会话工厂SqlSessionFactory:实现了三个接口:InitializingBean、FactoryBean、ApplicationListener。InitializingBean实现AfterPropertiesSet方法,在bean属性值设置完后调用。调用了buildSqlSesssionFactory方法。创建Configuration对象。创建解析全局配置文件XMLConfigBuilder。FactoryBean接口让用户自定义实例化Bean逻辑。获取SqlSessionFactoryBean,就会调用它的getObject方法。getObject方法调用了afterPropertiesSet方法,做mybatis解析配置,返回DefaultSqlSessionFactory。ApplicationListener监听ContextRefreshedEven(上下文刷新实践),会在SPring容器加载完后执行。

创建会话SqlSession:DefaultSqlSession是线程不安全的。mybatis-spring包,提供了线程安全的SqlSession包装类,SqlSessionTemplate。可以在所有DAO层共享实例(默认单例)。SqlSessionTemplate,增删改查都是调用代理对象的方法。代理对象在构造方法通过JDK动态代理创建:怎么拿到一个SqlSessionTemplate?提供抽象支持类SqlSessionDaoSupport,持有一个SqlSessionTemplate对象,提供getSqlSession方法。在实现类得方法里,可以直接调用父类封装的selectOne方法,最终会调用sqlSessionTemplate的selectOne方法。

接口的扫描注册:MapperScannerConfigurer用来扫描Mapper接口的。MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor接口。BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor子类,里面有一个postProcessBeanDefintionRegistry方法。MapperScannerConfigurer重写了postProcessBeanDefintionRegistry方法。创建了scanner对象,设置属性。

接口注入使用:Spring如何把 mybatis集成进去?提供SqlSession替代品SqlSessionTemplate,里面有一个实现InvocationHandler的内部SqlSessionInterceptor,本质是对SqlSession的代理。提供获取SqlSessionTemplate的抽象类SqlSessionDaoSupport。扫描Mapper接口,注册到容器中的是MapperFactoryBean。把Mapper注入使用的时候,调用的是getObject方法。执行Mapper接口任意方法,会走到触发管理类MapperProxy,进去SQL处理流程。学到了?1.为组件预留扩展接口。2.利用Spring扩展机制,把组件集成到mybatis中。设计模式总结:

参考资料:咕泡学院·MyBatis插件原理与Spring集成·青山
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
山外面包一个病旁是什么字 我的笔记本电脑显示电源的灯一直在绿色和橘红色之间闪烁,这是怎么回事... 笔记本电脑3个灯笔记本电脑这几个指示灯分别是啥意思 ...我的y470.第3个指示灯是橘红色的,开不了机,不知道怎么了?就开不了... QQ空间皮肤的代码是怎么放进去的啊. 为什么我在地址栏中输入皮肤代码按回车键,但一按空间就没有了 请教个问题哈~关于qq空间背景代码的,我在IE栏里输了代码,为啥每次弹出 ... win10删除多余的输入法 win10怎么删除多余的输入法 win10输入法怎么删除 win10输入法删除方法 如何做出爽口不腻、口味纯正的孟和尚粉肠? 我手机恢复出厂设置后,打开允许未知来源。 但是还是不能下载东西。这个... ...之后为什么不能在百度上下载软件了 未知来源开了 手机自从重置过后就安装不了软件,内存明明是够的可就要提示内存不足... ...就不能安装软件了,内存也足够,外来软件也打开了,就是显示安装失败... 重庆哪个地方繁华 重庆什么地方最旺 重庆市九龙坡区怎么样 重庆哪个区的商圈最繁华? 重庆哪个地方的人消费水平高, 重庆消费为什么这么高? 解放碑经济圈 看图猜成语x高水x 明星如何直播游戏 巫师3狂猎1.11版刷钱方法 巫师3狂猎怎么刷钱 中土世界 和巫师3 纠结买哪一个 郑智轻轻一挥胳膊,比利时球员就倒地了? 昨晚中国足球队被罚红牌的球员是谁? 不吹不黑,在中国最有名气的足球运动员是谁 不吹不黑,郑智究竟水平应该在什么档次 靳东陆风的电视剧叫什么 重庆国庆一天适合去哪里玩,景区推荐重庆国庆 仙剑奇侠传三观后感 风若约光有期谁的诗 朝暮为画,四季成诗出自哪里 喝普洱橘皮茶什么好处 橘皮茶的功效与作用橘皮茶的泡法 喝橘皮茶的功效与作用 橘皮茶的功效与作用 橘皮茶的泡法 新鲜橘皮茶的功效与作用 佛山哪里卖银手链 苹果6屏幕有一个灰点是怎么回事啊? 苹果6今天刚买的 屏幕里有好几个灰点怎么办啊 商场说让我去售后检测 谁... 你好,我的苹果6屏幕右上角出现灰暗点!这是怎么回事儿!以前也没注_百度... ...起重10T 跨度20米 高10米 两边跳出5米 带小车 该选用什么什么式样的... 一个仓库从里面量长20米、宽10米、高5米。里面堆放的粮食只占仓库容积的... ...又有几种能装几t货希望大家帮我个忙。在这里谢谢大家了。 阐明阐述阐发阐释的区别159句 阐述和阐释的区别 宝宝见热脸就红怎么办 甘露醇注意事项