温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Spring使用Proxy和cglib实现动态代理的方法

发布时间:2020-06-22 22:29:37 来源:亿速云 阅读:225 作者:元一 栏目:开发技术

这篇文章运用简单易懂的例子给大家介绍Spring使用Proxy和cglib实现动态代理的方法,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

spring中提供了两种动态代理的方式,分别是Proxy以及cglib,代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能;而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

添加一个接口以及对应的实现类

public interface HelloInterface {
  void sayHello();
}
public class HelloInterfaceImpl implements HelloInterface {
  @Override
  public void sayHello() {
    System.out.println("hello");
  }
}

JavaProxy通过实现InvocationHandler实现代理

public class CustomInvocationHandler implements InvocationHandler {
  private HelloInterface helloInterface;

  public CustomInvocationHandler(HelloInterface helloInterface) {
    this.helloInterface = helloInterface;
  }

  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("before hello for proxy");
    Object result = method.invoke(helloInterface, args);
    System.out.println("after hello for proxy");
    return result;
  }
}

而cglib实现MethodInterceptor进行方法上的代理

public class CustomMethodInterceptor implements MethodInterceptor {
  @Override
  public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    System.out.println("before hello for cglib");
    Object result = methodProxy.invokeSuper(o, objects);
    System.out.println("after hello for cglib");
    return result;
  }

}

分别实现调用代码

public static void main(String[] args) {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(HelloInterfaceImpl.class);
    enhancer.setCallback(new CustomMethodInterceptor());
    HelloInterface target = (HelloInterface) enhancer.create();
    target.sayHello();

    CustomInvocationHandler invocationHandler = new CustomInvocationHandler(new HelloInterfaceImpl());
    HelloInterface target2 = (HelloInterface) Proxy.newProxyInstance(Demo.class.getClassLoader(), new Class[]{HelloInterface.class}, invocationHandler);
    target2.sayHello();
  }

可以看到对于的代理信息输出

before hello for cglib
hello
after hello for cglib
before hello for proxy
hello
after hello for proxy

关于Spring使用Proxy和cglib实现动态代理的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI