3.1动态代理-第3章aop面向切面编程
2021-08-20 本文已影响0人
努力学习的lfk
3.1动态代理
1.能够实现在原有代码不改动的情况下,通过动态代理能够给原来的类增加一些额外功能。
2.减少重复代码。
3.专注业务逻辑代码。
4.解耦合,让业务功能和非业务功能(日志、事务等)分离。
动态代理:程序在整个运行过程中根本就不存在目标类的代理类,目标对象的代理对象只是由代理生成工具在程序运行时由JVM根据反射等机制动态生成的。代理对象与目标对象的代理关系在程序运行时才确立。
3.1.1 JDK动态代理
使用jdk的Proxy实现代理,要求目标类与代理类实现相同的接口。若目标类不存在接口,则无法通过该方法实现。
从jdk1.3以来,Java语言通过java.lang.reflect包提供三个类支持代理模式Proxy、Method、InvocationHandler
Method:执行目标类的方法,通过Method类实现
实现步骤:
1)创建目标类,SomeServiceImpl目标类,给它的doSome、doOther增加时间、事务。
2)创建InvocationHandler接口的实现类,在这个类实现给目标方法增加的功能。
执行目标对象
method.invoke(目标对象,args);
通过Method类实现,执行目标类的方法.png
记录执行方法的返回值.png
创建工具类.png
新增功能.png
3)使用jdk中类Proxy,创建代理对象。实现创建对象的能力。
在InvocationHandler接口的实现类,保存目标对象 创建目标对象 创建IncationHandler对象.png使用Proxy创建代理,语法:
Proxy.newProxyInstance(目标对象.getClass().getClassLoader(),目标对象.getClass().getInterfaces(),InvocationHandler对象);
创建Proxy对象.png
Proxy对象强制类型转换.png
通过代理执行方法.png
若只想让某个方法增加功能,可在InvocationHandler接口的实现类中,进行判断
指定某个方法实现动态代理.png equals与==的区别.png3.1.2 CGLIB动态代理
第三方的工具库,创建代理对象,原理是继承。通过继承生成目标类的子类,在子类中通过重写父类的方法,来实现功能的增强(类能继承就行,不需要接口)
要求目标类不能是final类型的,因为final类型的类不能被继承、final类型的方法不能被子类重写