首先解释下,标题的意思,一般在Java动态代理中,委托类一般都是实现某接口的具体类,但最近在看mybatis源码的时候,发现mybatis中的mapper接口(XML接口用java接口来描述)并没有实现类 :
sqlsession.getMapper(userMapper.class); //userMapper并没有实现类,仅仅只是一个接口
这与我们平常所学的动态代理不一样,为了一探究竟自己写了一个对接口的动态代理
- package cn.DesignPattern.DynamicProxy;
-
- public interface Movable {
- void move();
- }
下面对这个接口代理
- package cn.DesignPattern.DynamicProxy;
-
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
-
- public class Main2 {
-
- public static void main(String[] args) {
- Movable move=(Movable)Proxy.newProxyInstance(Movable.class.getClassLoader(), new Class[]{Movable.class}, new InvocationHandler(){
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- System.out.println("start----");
- System.out.println("这里做自己的事情");
- System.out.println("end----");
- return null;
- }
- }
- );
- move.move();
- }
- }
运行结果:
![](https://img-blog.csdn.net/20160529235950998?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
结论:
1)原理上:JDK动态动态代理的原理是根据 InvocationHandler 中的invoke()方法,由jdk为你的接口手动生成了一个实现了对应接口的类,因此,你的接口可以调用,这是理解mybatis接口没有实现类能被调用的关键。
2)功能上:可以看出mybatis中的接口就是XML文件的描述,一方面这样做的目的是和spring集成,将接口交给spring管理;另一方面是为了更加方便的管理XML文件(使用接口的package+interface作为namespace,method作为ID)
3) 写的不好,望各位大神不要拍砖