21.05.10
动态代理
动态代理的作用:
1)在目标类源代码不改变的情况下,增加功能
2)减少代码的重复
3)专注业务逻辑代码
4)解耦合,让业务功能和入职,事务非业务功能分离
实现方式:jdk动态代理(基于接口),使用jdk中的Proxy,Method,InvacationHanderl创建的对象。
jdk动态代理要求目标类必须实现接口
cglib动态代理(基于子类):第三方的工具库,创建代理对象,原理时继承。通过继承目标类,创建子类。子类就是代理对象。要求目标类不能时final的,方法也不能时final的
就是增加辅助功能
begin
动态代理的功能其实和代理大同小异,但不同的是只需要指定一组接口及委托类对象(也就是上文的实现类,可以理解为侦探,有人委托,就有侦探来代理辅助破案嘛)和接口(要实现的功能),就可以弹性的执行。
就是说不需要像上面一样手动的写代理类,只需要直接调用就可以对你自定义的委托类实现功能辅助。
而要使用动态代理,需要了解invoke方法以及Proxy类的newProxyINstance方法
先大致讲下思想就是
你得有一个代理类,而这个代理类呢得implement系统的InvocationHandler接口以实现invoke方法,然后你可以invoke方法里调用你实现类的方法并且添加辅助方法。
最后通过newProxyINstance()方法实例化接口进行调用接口的功能;
对于invoke方法,这里有两个invoke方法 一个是InvocationHandler接口实现的invoke方法,还有一个是method的invoke方法。
对于InvocationHandler的invoke方法一会儿Proxy类的newProxyINstance方法会将其执行。
而method的invoke方法,我们再InvocationHandler的invoke方法中调用,并可以再前后加入辅助方法,这就跟前面的静态代理大同小异了。
我们先说Proxy.newProxyINstance方法
这个方法有三个参数
ClassLoader loader,Class<?>[] interfaces, InvocationHandler h
第一个是一个类加载器,就是你要去使用方法的类,第二个就是该类实现的接口功能,第三个要传的就是你的代理类对象。
注意这个方法会帮你调用代理类的invoke方法,里面的参数也会由你加载的类以及接口提供。
所以对于InvocationHandler的invoke方法里面有三个参数Object proxy, Method method, Object[] args就有人提供了
…
再说到method的invoke方法,Object obj, Object… args
第一个要传入对象,另一个是一个可变参数,要传入你需要的参数
这个方法是通过上一个invoke方法中的method.invke来调用的所以参数就是该方法需要的参数
最后Proxy.newProxyINstance方法会返回一个Object对象,可以用你要实现的接口实例化去接收他,然后通过此接口调用该方法就是通过代理对象去调用你实现对象要调用的方法了
end
( begin-end 摘自:https://blog.csdn.net/SUMMER_RAINOW/article/details/114991553)
例子:见21.05.09spring学习记录的jdk动态代理(https://blog.csdn.net/xiaoping__/article/details/116570110?spm=1001.2014.3001.5501)