mybatis中接口没有实现类的动态代理探究
2016-05-30 00:16
218 查看
首先解释下,标题的意思,一般在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();
}
}
运行结果:
结论:
1)原理上:JDK动态动态代理的原理是根据 InvocationHandler 中的invoke()方法,由jdk为你的接口手动生成了一个实现了对应接口的类,因此,你的接口可以调用,这是理解mybatis接口没有实现类能被调用的关键。
2)功能上:可以看出mybatis中的接口就是XML文件的描述,一方面这样做的目的是和spring集成,将接口交给spring管理;另一方面是为了更加方便的管理XML文件(使用接口的package+interface作为namespace,method作为ID)
3) 写的不好,望各位大神不要拍砖
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();
}
}
运行结果:
结论:
1)原理上:JDK动态动态代理的原理是根据 InvocationHandler 中的invoke()方法,由jdk为你的接口手动生成了一个实现了对应接口的类,因此,你的接口可以调用,这是理解mybatis接口没有实现类能被调用的关键。
2)功能上:可以看出mybatis中的接口就是XML文件的描述,一方面这样做的目的是和spring集成,将接口交给spring管理;另一方面是为了更加方便的管理XML文件(使用接口的package+interface作为namespace,method作为ID)
3) 写的不好,望各位大神不要拍砖
相关文章推荐
- 深入浅析mybatis oracle BLOB类型字段保存与读取
- MyBatis MapperProvider MessageFormat拼接批量SQL语句执行报错的原因分析及解决办法
- SpringMVC整合mybatis实例代码
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
- MyBatis学习笔记(二)之关联关系
- 浅析Mybatis 在CS程序中的应用
- Java Mybatis框架入门基础教程
- Windows下Java+MyBatis框架+MySQL的开发环境搭建教程
- Mybatis与Ibatis的区别
- MyBatis学习教程(二)―如何使用MyBatis对users表执行CRUD操作
- MyBatis学习教程(四)-如何快速解决字段名与实体类属性名不相同的冲突问题
- Java简单实现SpringMVC+MyBatis分页插件
- MyBatis批量添加、修改和删除
- MyBatis与Hibernate的比较
- 浅析mybatis和spring整合的实现过程
- 在Java的MyBatis框架中建立接口进行CRUD操作的方法
- 整理Java的MyBatis框架中一些重要的功能及基本使用示例
- mybatis的动态sql详解(精)
- MyBatis实践之动态SQL及关联查询
- 详解Mybatis动态sql