mybatis中接口没有实现类的动态代理探究

4 篇文章 0 订阅
3 篇文章 0 订阅

首先解释下,标题的意思,一般在Java动态代理中,委托类一般都是实现某接口的具体类,但最近在看mybatis源码的时候,发现mybatis中的mapper接口(XML接口用java接口来描述)并没有实现类 :

 sqlsession.getMapper(userMapper.class); //userMapper并没有实现类,仅仅只是一个接口

这与我们平常所学的动态代理不一样,为了一探究竟自己写了一个对接口的动态代理

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package cn.DesignPattern.DynamicProxy;  
  2.   
  3. public interface Movable {  
  4.    void move();  
  5. }  

下面对这个接口代理

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package cn.DesignPattern.DynamicProxy;  
  2.   
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5. import java.lang.reflect.Proxy;  
  6.   
  7. public class Main2 {  
  8.   
  9.     public static void main(String[] args) {  
  10.         Movable move=(Movable)Proxy.newProxyInstance(Movable.class.getClassLoader(), new Class[]{Movable.class}, new InvocationHandler(){  
  11.             @Override  
  12.             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
  13.                 System.out.println("start----");  
  14.                 System.out.println("这里做自己的事情");  
  15.                 System.out.println("end----");  
  16.                 return null;  
  17.             }     
  18.     }  
  19.     );  
  20.      move.move();  
  21.   }  
  22. }   

运行结果:



结论:

           1)原理上:JDK动态动态代理的原理是根据 InvocationHandler 中的invoke()方法,由jdk为你的接口手动生成了一个实现了对应接口的类,因此,你的接口可以调用,这是理解mybatis接口没有实现类能被调用的关键。

           2)功能上:可以看出mybatis中的接口就是XML文件的描述,一方面这样做的目的是和spring集成,将接口交给spring管理;另一方面是为了更加方便的管理XML文件(使用接口的package+interface作为namespace,method作为ID)

           3) 写的不好,望各位大神不要拍砖

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值