Spring 动态代理

176 阅读1分钟

Spring 动态代理的实现有两种方式,分别是JDK动态代理和CgLib。其中JDK动态代理需要目标对象实现接口,Cglib方式需要实现继承,如果为final类拒绝继承,则不能实现。SpringAop默认利用JDK动态代理实现。 下面介绍JDK动态代理的一个demo。

demo结构

1、定义接口

package com.example.jdkproxy.demo;

public interface PrintC {

    void doSomething();

}

2、给出接口的实现类

public class PrintCImpl implements PrintC {
    @Override
    public void doSomething() {
        System.out.println("Print Hello");

    }
}

3、实现JDK动态的代理


public class JDKDynamicProxy implements InvocationHandler {
    
    private Object target;

    public JDKDynamicProxy(Object target) {
        this.target = target;
    }

    /**
     * 获取被代理接口实例对象
     * @param <T>
     * @return
     */
      public <T> T getProxy() {
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Do something before");
        Object result = method.invoke(target, args);
        System.out.println("Do something after");
        return result;
    }
}

4、测试

public class BootTest {
    public static void main(String[] args) {

        // 动态代理实现
        JDKDynamicProxy reflectionHandler = new JDKDynamicProxy(new PrintCImpl());
        PrintC proxy = reflectionHandler.getProxy();
        proxy.doSomething();
    }
}

5、结果

源码见:github.com/liu2580/dem…