参考我们阅读源码画的uml图,来实现我们自己的参数封装为Map的过程(造个轮子)
阅读源码文章参考:mybatis参数封装Map过程的源码解析
输入是执行带@MyParam的方法
输出是一个Map,其key是@MyParam的value,其value是方法@MyParam对应的参数值
BootStrap
输入是
Class clazz = EmployeeMapper.class;
EmployeeMapper mapper = (EmployeeMapper) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz},
new MyMapperProxy<>(clazz,
methodCache));
mapper.getEmpByMyIdAndLastName(1, "tom");
输出就是一个Map,在MyMapperProxy的invoke中获取到并打印出来
MyMapperProxy
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (Object.class.equals(method.getDeclaringClass())) {
return method.invoke(this,args);
}
if (method.getName().equals("getEmpByMyIdAndLastName")) {
MyMapperMethod myMapperMethod = cacheMapperMethod(method);
Map paramsMap = (Map) myMapperMethod.getParamsMap(args);
System.out.println(paramsMap);
}
return null;
}
MyMapperMethod
public Object getParamsMap(Object[] args) {
return methodSignature.convertArgsToParam(args);
}
MyParamNameResolver
主要的逻辑代码写在这里,在其构造函数中传入Method,得到names
之后通过getNameParams方法,来组装map
源码参考:https://gitee.com/constfafa/mybatis_demo.git