jdk动态代理在mybatis的动态代理的应用

jdk的动态代理使用方式

暂且不用管jdk的实现原理是啥,理解jdk动态代理的使用方式。

我们在使用接口时,所有interface类型的变量总是通过向上转型并指向某个实例的:UserInterface user = new UserImpl() ,那么我们想偷懒一下,有没有可能不编写实现类,直接在运行期创建某个interface的实例呢?调用接口时不用每次为该接口编写实现类,让其实现类自动生成。

jdk提供了一套动态代理的机制可以帮助我们做到。可以在运行期动态创建某个interface的实例。

我们仍然先定义了接口UserService,但是我们并不去编写实现类,而是直接通过JDK提供的一个 Proxy.newProxyInstance() 创建了一个UserService接口对象。

这种没有实现类但是在运行期动态创建了一个接口对象的方式,我们称为动态代码。JDK提供的动态创建接口对象的方式,就叫动态代理。 动态代理的核心思想 :创建需要被代理的接口,如果使用了动态代理该接口,减少了手动编写接口实现类的繁琐工作

如下通过一个jdk的动态代理demo更好的理解。

public interface UserService {
   
   
    public String select();
    public void update();
}

代理类,该代理类代理哪个接口,需要在实例化代理类的时候指定。创建了代理类,我们可以在代理类中任意创建方法。

package com.marsdl.demo.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class UserServiceJdkProxy implements InvocationHandler {
   
   
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
   
        //根据业务需要编写实现代码,被代理的方法都要经过该方法
        System.out.println(method);
        return "nihao";
    }
}

调用被代理的接口 UserService 均会调用 UserServiceJdkProxy 类中的 invoke 方法。看到这里明白了,动态代理的好处,我们可以同意对某个接口中的所有方法的实现进行管理。

动态代理的实例化,实例化的过程中,需要指定该动态代理代理哪个接口。

import java.lang.reflect.Proxy;

public class Test {
   
   
    public static void main(String[] args) {
   
   
        UserService hello = (UserService) Proxy.newProxyInstance(
                UserService.class.getClassLoader(), // 传入ClassLoader
                new Class[]{
   
   UserService.class}, // 传入要实现的接口
                new UserServiceJdkProxy()); // 传入处理调用方法的InvocationHandler
        String result = hello.select();
        System.out.println(result);
    }
}

在运行期动态创建一个interface实例的方法如下:

  • 定义一个InvocationHandler实例,它负责实现接口的方法调用;
  • 通过Proxy.newProxyInstance()创建interface实例,它需要3个参数:使用的ClassLoader,通常就是接口类的ClassLoader
  • 需要实现的接口数组,至少需要传入一个接口进去;用来处理接口方法调用的InvocationHandler实例;将返回的Object强制转型为接口。

参考文章: 动态代理https://www.liaoxuefeng.com/wiki/1252599548343744/1264804593397984

jdk的动态代理在mybatis中的使用
dao接口与mapper.xml绑定,为其生成代理工厂

通过动态代理的样例,知道动态代理的创建方法以及动态代理存在的目的。为了能够更好的理解动态代理在实际的应用,以mybatis源码为例子,阐述我对动态代理在实际应用的理解。

通过哪种方法调用与使用到动态代理的文章,请首先阅读(必读,因为我下文在此基础上解释),JDK动态代理实现原理mybatis–动态代理实现 ,这两篇博客写的非常好,很容易阅读。

public class MapperProxyFactory<T> {
   
   

  private final Class<T> mapperInterface;
  private final Map<Method, MapperMethodInvoker> methodCache 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值