06_aop原理-(静态代理-动态代理)

静态代理:在程序运行前就已经存在代理类的字节码文件,代理对象和真实对象的关系在运行前就确定了。

静态代理优缺点:
优点:
业务类只需要关注业务逻辑本身,保证了业务类的重用性。把真实对象隐藏在代理类内部,保证了真实对象的安全性.
缺点:
1.代理对象的某个接口只服务于某一种类型的对象,也就是说每一个真实对象都得创建一个代理对象。
2.如果需要代理的方法很多,则要为每一种方法都进行代理处理。 
3.如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

动态代理模式

客户端直接使用的都是代理对象,不知道真实对象是谁,此时代理对象可以在客户端和真实对象之间起到中介的作用。
1、代理对象完全包含真实对象,客户端使用的都是代理对象的方法,和真实对象没有直接关系;
2、代理模式的职责:把不是真实对象该做的事情从真实对象上撇开——职责清晰;

静态代理:在程序运行前就已经存在代理类的字节码文件,代理对象和真实对象的关系在运行前就确定了。
动态代理:动态代理类是在程序运行期间由JVM通过反射等机制动态的生成的,所以不存在代理类的字节码文件。代理对象和真实对象的关系是在程序运行事情才确定的。 

JDK的动态代理机制(真实对象必须得存在接口):

JDK动态代理API分析:
1、java.lang.reflect.Proxy 类:
Java 动态代理机制生成的所有动态代理类的父类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象。
主要方法:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler hanlder)

方法职责:为指定类加载器、一组接口及调用处理器生成动态代理类实例

参数:
loader		:类加载器
interfaces		:模拟的接口
hanlder		:代理执行处理器

返回:动态生成的代理对象
2、java.lang.reflect.InvocationHandler接口:

public Object invoke(Object proxy, Method method, Object[] args)

方法职责:负责集中处理动态代理类上的所有方法调用
参数:

proxy	:生成的代理对象
method	:当前调用的真实方法对象
args	:当前调用方法的实参

返回: 真实方法的返回结果
jdk动态代理操作步骤

① 实现InvocationHandler接口,创建自己增强代码的处理器。
② 给Proxy类提供ClassLoader对象和代理接口类型数组,创建动态代理对象。
③ 在处理器中实现增强操作。

JDK动态代理:

1,代理对象必须要实现一个接口;
2,需要为每个对象创建代理对象;
3,动态代理的最小单位是类(所有类中的方法都会被处理);

JDK动态代理总结:

1,JAVA动态代理是使用java.lang.reflect包中的Proxy类与InvocationHandler接口这两个来完成的。
2,要使用JDK动态代理,必须要定义接口。
3,JDK动态代理将会拦截所有pubic的方法(因为只能调用接口中定义的方法),这样即使在接口中增加了新的方法,不用修改代码也会被拦截。
4,如果只想拦截一部分方法,可以在invoke方法中对要执行的方法名进行判断。

CGLIB代理总结:

1,CGLIB可以生成目标类的子类,并重写父类非final修饰符的方法。
2,要求类不能是final的,要拦截的方法要是非final、非static、非private的。
3,动态代理的最小单位是类(所有类中的方法都会被处理);

如果有接口有限选用JDK动态代理,如果没有接口考虑使用CGLIB方式.

    原文作者:AOP
    原文地址: https://blog.csdn.net/qq_33238150/article/details/82828282
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞