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

最低0.47元/天 解锁文章
3271

被折叠的 条评论
为什么被折叠?



