spring中的动态代理

Posted yytxdy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring中的动态代理相关的知识,希望对你有一定的参考价值。

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中的动态代理的主要内容,如果未能解决你的问题,请参考以下文章

Java——面向切面编程,Spring中的AOP编程

Spring Boot 中的 AOP,到底是 JDK 动态代理还是 Cglib 动态代理?

学习笔记Spring中的动态代理

学习笔记Spring中的动态代理

Spring总结七:AOP动态代理的实现

Java--Spring之AOP面向切面编程