企业如何通过vue小程序开发满足高效运营与合规性需求
488
2023-05-23
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~