Spring AOP JDK的动态代理

98 阅读1分钟

OrderService接口

public interface OrderService {
    String getName();
    void generate();
    void modify();
    void detail();
}

OrderServiceImpl

public class OrderServiceImpl implements OrderService {


    @Override
    public String getName() {
        return "zhangsan";
    }

    @Override
    public void generate() {
        try {
            Thread.sleep(1234);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("order generate...");
    }

    @Override
    public void modify() {
        try {
            Thread.sleep(456);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("order modify...");
    }

    @Override
    public void detail() {
        try {
            Thread.sleep(41);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("order detail...");
    }
}

OrderServiceDynamicProxy

public class OrderServiceDynamicProxy implements InvocationHandler {
    private Object target;
    public OrderServiceDynamicProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("invoke...");

        long begin = System.currentTimeMillis();
        Object returnVal = method.invoke(target, args);
        long end = System.currentTimeMillis();

        System.out.println("use time: "+(end-begin)+" ms");

        return returnVal;
    }
}

测试类

public class OrderTest {
    public static void main(String[] args) {
        OrderServiceImpl target = new OrderServiceImpl();
        
        // Proxy.newProxyInstance(类加载器,代理类要实现的接口,调用处理器)
        OrderService proxyObj = (OrderService) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new OrderServiceDynamicProxy(target)
        );

        proxyObj.generate();
        proxyObj.modify();
        proxyObj.detail();
        String name = proxyObj.getName();  //这里取决于OrderServiceDynamicProxy的invoke是否返回值了
        System.out.println(name);

    }
}

image.png