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

网友投稿 488 2023-05-23

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

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 InvocationHandhttp://ler {

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实现MethodIhttp://nterceptor进行方法上的代理

public class Custohttp://mMethodInterceptor 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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springboot实现发送邮件(QQ邮箱为例)
下一篇:使用maven命令安装jar包到本地仓库的方法步骤
相关文章

 发表评论

暂时没有评论,来抢沙发吧~