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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
深入学习java并发包ConcurrentHashMap源码
这篇文章主要介绍了深入学习java并发包ConcurrentHashMap源码,整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表”部分“或”一段“的意思,所以很多地方都会将其描述为分段锁。,需要的朋友可以参考下2019-06-06spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用
本篇文章主要介绍了spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用,具有一定的参考价值,有兴趣的可以了解一下。2017-04-04
最新评论