自学内容网 自学内容网

AOP和动态代理

JDK和CGLIB动态代理的区别

  • JDK代理使用的是反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
  • CGLIB代理使用字节码处理框架ASM,对代理对象类的class文件加载进来,通过修改字节码生成子类。

JDK创建代理对象效率较高,执行效率较低;

CGLIB创建代理对象效率较低,执行效率高。

JDK动态代理机制只能对实现接口的类生成代理,通过反射动态实现接口类;

CGLIB则使用的继承机制,针对类实现代理,被代理类和代理类是继承关系,所以代理类是可以赋值给被代理类的,因为是继承机制,不能代理final修饰的类。

JDK代理是不需要依赖第三方的库,只要JDK环境就可以进行代理,需要满足以下要求:

 1.实现InvocationHandler接口,重写invoke()

 2.使用Proxy.newProxyInstance()产生代理对象

 3.被代理的对象必须要实现接口

UserInterface proxyInstance = (UserInterface) Proxy.newProxyInstance(Test2.class.getClassLoader(), new Class[]{UserInterface.class}, new InvocationHandler() {
      @Override
      public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
         method.invoke(target,objects);
         return null;
      }
   });
   proxyInstance.test();

CGLib 必须依赖于CGLib的类库,需要满足以下要求:

 1.实现MethodInterceptor接口,重写intercept()

 2.使用Enhancer对象.create()产生代理对象

Enhancer enhancer = new Enhancer();
      enhancer.setSuperclass(UserService.class);

      // 定义额外逻辑,也就是代理逻辑
      enhancer.setCallbacks(new Callback[]{new MethodInterceptor() {
         @Override
         public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("before...");
            Object result = methodProxy.invoke(target, objects);
            System.out.println("after...");
            return result;
         }
      }, NoOp.INSTANCE});

      enhancer.setCallbackFilter(new CallbackFilter() {
         @Override
         public int accept(Method method) {
            if (method.getName().equals("test")) {
               return 0;
            }else return 1;
         }
      });


原文地址:https://blog.csdn.net/weixin_42923363/article/details/142877768

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!