Java代理模型

引用文章 https://www.cnblogs.com/boboxing/p/8126046.html

代理模式是什么

代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展。

代理的作用在于不修改目标代码的情况下,可以控制对目标的访问,可以在其前后加上自己的业务处理代码,甚至阻止对目标方法的访问,有点类似于过滤器和拦截器的作用。

代理模式

  • 静态代理
    • 继承       代理对象继承目标对象,重写增强方法   缺点:会产生代理类过多、非常复杂
    • 聚合目标对象和代理对象实现同一接口,代理对象当中要包含目标对象  缺点:也会产生类爆炸,只是比继承少一点点

     总结: 如果在不确定的情况下,不要去使用静态代理,一代写代码就会产生类,一旦产生类就会爆炸。

  • 动态代理  

1.JDK动态代理

    • 调用Proxy类的静态方法newProxyInstance即可,该方法会返回代理类对象

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
接收的三个参数依次为:
  • ClassLoader loader:指定当前目标对象使用类加载器,写法固定
  • Class<?>[] interfaces:目标对象实现的接口的类型,写法固定
  • InvocationHandler h:事件处理接口,需传入一个实现类,一般直接使用匿名内部类

生产的代理类 $Proxy0 extends Proxy implements targerInterface 

2.CGLib动态代理

原理:使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理。唯一需要注意的是 CGLib不能对声明为final的方法进行代理 ,因为CGLib原理是动态生成被代理类的子类。 详细分析引用:https://www.cnblogs.com/monkey0307/p/8328821.html

前提条件:

  • 需要引入cglib的jar文件,由于Spring的核心包中已经包括了Cglib功能,所以也可以直接引入spring-core-3.2.5.jar
  • 目标类不能为final
  • 目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法

猜你喜欢

转载自www.cnblogs.com/SweetnessInstinct/p/11674712.html