Spring如何基于Proxy及cglib实现动态代理

 更新时间:2020年06月22日 11:04:13   作者:yytxdy  
这篇文章主要介绍了Spring如何基于Proxy及cglib实现动态代理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

spring中提供了两种动态代理的方式,分别是Java Proxy以及cglib

JavaProxy只能代理接口,而cglib是通过继承的方式,实现对类的代理

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringMVC请求、响应和拦截器的使用实例详解

    SpringMVC请求、响应和拦截器的使用实例详解

    拦截器(Interceptor) 它是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的,这篇文章给大家介绍SpringMVC请求、响应和拦截器的使用,感兴趣的朋友一起看看吧
    2024-03-03
  • 详解spring cloud ouath2中的资源服务器

    详解spring cloud ouath2中的资源服务器

    这篇文章主要介绍了spring cloud ouath2中的资源服务器的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • java实现简单图片上传下载功能

    java实现简单图片上传下载功能

    这篇文章主要为大家详细介绍了java实现简单图片上传下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 怎么把本地jar包放入本地maven仓库和远程私服仓库

    怎么把本地jar包放入本地maven仓库和远程私服仓库

    这篇文章主要介绍了怎么把本地jar包放入本地maven仓库和远程私服仓库的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • java this 用法详解及简单实例

    java this 用法详解及简单实例

    这篇文章主要介绍了java this 用法详解及简单实例的相关资料,需要的朋友可以参考下
    2017-03-03
  • 深入学习java并发包ConcurrentHashMap源码

    深入学习java并发包ConcurrentHashMap源码

    这篇文章主要介绍了深入学习java并发包ConcurrentHashMap源码,整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表”部分“或”一段“的意思,所以很多地方都会将其描述为分段锁。,需要的朋友可以参考下
    2019-06-06
  • Java实现显示指定类型的文件

    Java实现显示指定类型的文件

    这篇文章主要介绍了Java实现显示指定类型的文件,需要的朋友可以参考下
    2014-03-03
  • 关于ReentrantLock原理全面解读

    关于ReentrantLock原理全面解读

    这篇文章主要介绍了关于ReentrantLock原理全面解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java中的动态代理原理及实现

    Java中的动态代理原理及实现

    这篇文章主要介绍了Java中的动态代理原理及实现,动态是相对于静态而言,何为静态,即编码时手动编写代理类、委托类,而动态呢,是不编写具体实现类,等到使用时,动态创建一个来实现代理的目的,需要的朋友可以参考下
    2023-12-12
  • spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用

    spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用

    本篇文章主要介绍了spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04

最新评论