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

以上是 Spring如何基于Proxy及cglib实现动态代理 的全部内容, 来源链接: utcz.com/z/332198.html

回到顶部