行业用品网站怎么建设外链,专做彩票的网站,建设学风建设专题网站,球队积分排名一日小区漫步#xff0c;我问朋友#xff1a;Mybatis中声明一个interface接口#xff0c;没有编写任何实现类#xff0c;Mybatis就能返回接口实例#xff0c;并调用接口方法返回数据库数据#xff0c;你知道为什么不#xff1f;
朋友很是诧异#xff1a;是啊#xff…一日小区漫步我问朋友Mybatis中声明一个interface接口没有编写任何实现类Mybatis就能返回接口实例并调用接口方法返回数据库数据你知道为什么不
朋友很是诧异是啊我也很纳闷我们领导告诉我们按照这个模式编写就好了我同事也感觉很奇怪虽然我不知道具体是怎么实现的但我觉得肯定是……此处略去若干的漫天猜想但是也不对啊难道是……再次略去若干似懂非懂。
这激发了我写本篇文章的冲动。
动态代理的功能通过拦截器方法回调对目标target方法进行增强。
言外之意就是为了增强目标target方法。
上面这句话没错但也不要认为它就是真理殊不知动态代理还有投鞭断流的霸权连目标target都不要的科幻模式。
注本文默认认为读者对动态代理的原理是理解的如果不明白target的含义难以看懂本篇文章建议先理解动态代理。
1. 自定义JDK动态代理之投鞭断流实现自动映射器Mapper 接下来我们看看如何使用动态代理之投鞭断流实现实例化接口并调用接口方法返回数据的。
自定义一个InvocationHandler。 上面代码中的target在执行Object.java内的方法时target被指向了thistarget已经变成了傀儡、象征、占位符。在投鞭断流式的拦截时已经没有了target。
写一个测试代码 这便是Mybatis自动映射器Mapper的底层实现原理。
可能有读者不禁要问你怎么把代码写的像初学者写的一样没有结构且缺乏美感。
必须声明作为一名经验老道的高手能把程序写的像初学者写的一样那必定是高手中的高手。这样可以让初学者感觉到亲切舒服符合自己的Style让他们或她们感觉到大牛写的代码也不过如此自己甚至写的比这些大牛写的还要好从此自信满满热情高涨认为与大牛之间的差距仅剩下三分钟。
2. Mybatis自动映射器Mapper的源码分析
首先编写一个测试类 org.apache.ibatis.binding.MapperProxy.java部分源码。 org.apache.ibatis.binding.MapperProxyFactory.java部分源码。
public class MapperProxyFactoryT { private final ClassT mapperInterface; SuppressWarnings(unchecked) protected T newInstance(MapperProxyT mapperProxy) { return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy); }
这便是Mybatis使用动态代理之投鞭断流。
3. 接口Mapper内的方法能重载overLoad吗重要
类似下面
public User getUserById(Integer id);public User getUserById(Integer id, String name);
Answer不能。
原因在投鞭断流时Mybatis使用packageMappermethod全限名作为key去xml内寻找唯一sql来执行的。
类似keyx.y.UserMapper.getUserById那么重载方法时将导致矛盾。对于Mapper接口Mybatis禁止方法重载overLoad。
学习时是先研究的源码看懂了原理。