mybatis框架是我们日常开发中用的比较多的ORM框架之一,其中有一个比较重要的地方就是关于对面向接口编程的理解,这里简单的写了一个小demo实现了一下跟大家分享一下。慕课网上一个mybatis框架视频还是挺不错的,这里就不打广告了感兴趣的可以自己看一看,是一个自动回复机器人的案例,相信很多人也都看过吧,哈哈。
面向接口编程最核心的还是动态代理(动态代理在SSM框架中都有体现,而动态代理实现的关键技术就是反射,所以这里给大家一个建议就是如果想对框架有比较深入的了解或者想深入理解源码的一定要深入了解一下反射以及代理模式),通过动态代理构建了一个接口的实现类,接口的实现方法最终执行的就是代理类中的invoke方法,下面的篇幅就不做过多的讲解了,代码里面也有一些相应的注释,感兴趣的也可以自己实现一下,可以帮助我们更好地理解动态代理的实现以及面向接口编程的思想。
这里先看一下没有实现类的接口IMessage
/**
* 没有实现类的接口
* 实际框架中就是根据输入的参数输出查询的结果
* 这里模拟了一个参数与返回结果
*/
public interface IMessage {
String getString(Integer integer);
}
然后看一下整体的测试类的编写`
/**
* 面向接口编程实现思路:
* 通过SqlSession里面的getMapper方法得到一个接口的代理实例
* 代理实例执行接口中的方法实际上执行了代理类(MapperProxy)中的invoke方法
* 所以实际框架中处理逻辑是在代理类的invoke方法中执行的
*/
public class MainTest {
public static void main(String[] args) {
/* 模拟构建的sqlsession对象,里面有一个getMapper方法
实际框架中是由sqlsessionfactory进行build得到的。实际的sqlsession中是有配置文件的信息的
*/
SqlSession sqlSession = new SqlSession();
/*
模拟的getMapper方法,这里需要关注的一个地方就是如何知道返回的类型就是IMessage
*/
IMessage iMessage = sqlSession.getMapper(IMessage.class);
/*
执行接口中的方法最终是执行代理类(MyProxy)的invoke方法
*/
String string = iMessage.getString(100);
System.out.println(string);
}
}
下面看一下SqlSession类,里面也只简单实现了一个getMapper方法
public class SqlSession {
public SqlSession(){}
/*
注意这里的传入的Class是带泛型的,return的时候根据泛型做了个强转,
这也就解释了为什么通过代理类可以返回的结果不用进行强转了
*/
public <T>T getMapper(Class<T> type){
return (T)Proxy.newProxyInstance(type.getClassLoader(), new Class[]{type}, new MyProxy());
}
}
最后的就是我们的代理类MyProxy
/**
* 没有实现类的接口的代理方法
*/
public class MyProxy implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("没有接口的实现类的方法执行到这儿了," + "我收到了参数" + args[0]);
System.out.println("接下来执行数据库交互得到数据库的结果");
return "我是代理类返回数据库查询结果" ;
}
}
最后在回过来再看一下测试类及结果
String string = iMessage.getString(100);
System.out.println(string);
// 最终控制台结果
/*
没有接口的实现类的方法执行到这儿了,我收到了参数100
接下来执行数据库交互得到数据库的结果
我是代理类返回数据库查询结果
*/
这里的实现还是比较简单的,对动态代理有一定的基础就可以实现了。这几天没事也在写一个简单的手写实现框架,实现也是比较简单的,大致思路就是自己构建xml文件,采用DOM解析xml得到配置文件以及sql语句信息,然后在invoke方法里面利用JDBC实现数据库交互得到结果,有机会再进行完善一下也会和大家分享的。
最后祝大家生活愉快工作顺利哟!!