MapperProxy是invocationHandler 真正调用处理程序的地方

1.Mapper mapper = sqlSession.getMapper(mapper.class)
mapper接口接收 到的 是一个Proxy.newProxyInstance 代理对象
而真正调用mapper.方法。执行的不是proxy执行的
是mapperProxy 这个invocationHandler(调用处理程序)具体执行的

public class SqlSession { /** * 动态代理 */ public <T> T getMapper(Class<T> clazz) { //类加载器: 负责加载代理类到内存中 ClassLoader classLoader = SqlSession.class.getClassLoader(); //Class[] interfaces = { UserMapper.class}; Class[] interfaces = {clazz}; T mapperProxy = (T) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() { //在调用UserMaper中的queryAllUser()方法时,代理对象执行invoke方法,返回List @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //创建核心配置类对象 Configuration config = new Configuration(); /******** 解析 @Select注解 *******/ Class clazz = Class.forName(config.getInterName()); Method[] methods = clazz.getMethods(); //遍历数组 for (Method m : methods) { //判断是否有注解 boolean boo = m.isAnnotationPresent(Select.class); //TODO boolean boo2 = m.isAnnotationPresent(ResultType.class); if (boo) { //获取@Select注解对象 Select select = m.getAnnotation(Select.class); //获取属性值 String[] value = select.value();//{"select * from user"} String sql = value[0]; //给Mapper对象中的sql成员变量赋值 config.getMapper().setSql(sql); //TODO ResultType resultType = m.getAnnotation(ResultType.class); String type = resultType.value(); config.getMapper().setResultType(type); } } 为什么这个可以创建一个实现所有接口方法的类,config只有一个怎样记录所有sql,返回值怎样做到可以调用接口中的所有方法
最新发布
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值