本文为原创文章,转载请注明出处
查看[Java]系列内容请点击:https://www.jianshu.com/nb/45938443
我们知道,Mybatis的Mapper一般只有一个接口和对应的XML文件,实际上,Mybatis也是通过动态代理来生成的对应接口的实体对象,这里可以仿着原理实现一个简单的,复杂的读者可自行实现。
实现总体上比较简单,首先我们需要准备几个东西:
- 一个Mapper接口:
MyMapper
,为了简化,里面只定义两个简单的方法,并返回String
- 一个仿Mapper的XML的txt文件:
MyMapper.txt
,里面用分号分割了两个字段:方法名和返回值- 一个代理类:
MapperProxy
,用来动态生成MyMapper
的对象- 一个测试的
Main
类和main
方法
MyMapper
接口定义:
public interface MyMapper {
String getName();
String getAge();
}
MyMapper.txt
内容:
getName:wanli
getAge:29
MapperProxy
类定义:
public class MapperProxy implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 这里直接解析txt文件,并将txt文件中得到的值作为函数返回值
BufferedReader reader = new BufferedReader(new FileReader("MyMapper.txt"));
String line = null;
Object result = null;
while ((line = reader.readLine()) != null) {
String[] lineStrs = line.split(":");
if (lineStrs[0].trim().equals(method.getName())) {
result = lineStrs[1].trim();
break;
}
}
reader.close();
return result;
}
}
测试类和方法:
public class Main {
public static void main(String[] args) {
// 实际动态代理生成动态的对象
MyMapper mapper = (MyMapper) Proxy.newProxyInstance(MyMapper.class.getClassLoader(), new Class[]{MyMapper.class}, new MapperProxy());
System.out.println(mapper.getName());
System.out.println(mapper.getAge());
}
}
输出结果:
wanli
29
看吧,这里就是使用动态代理,没有定义具体的接口的实现类,但是实现了相应的效果。