【AOP】JDK&Cglib动态代理使用案例

25 阅读1分钟

一、代理对象准备

public interface HelloService {
    void listen(String msg);
    String say();
}

public class HelloServiceTarget implements HelloService {
    @Override
    public void listen(String msg) {
        System.out.println("Listen: " + msg);
    }

    @Override
    public String say() {
        System.out.println("Say: hello");
        return "hello";
    }
}

二、JDK动态代理案例

public class Main {
    public static void main(String[] args) {
        HelloServiceTarget target = new HelloServiceTarget();
        HelloService proxy = (HelloService) createProxy(target);  //生成对象代理

        proxy.listen("Main");
        proxy.say();
    }

    private static Object createProxy(Object target) {
        Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("Proxy start...");
                Object result = method.invoke(target, args);
                System.out.println("Proxy stop...");
                return result;
            }
        });

        return proxy;
    }
}

三、Cglib动态代理案例

<!-- cglib依赖 -->
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>

public class Main {
    public static void main(String[] args) {
        HelloServiceTarget target = new HelloServiceTarget();
        HelloService proxy = (HelloService) createProxy(target);  //生成对象代理

        proxy.listen("Main");
        proxy.say();
    }

    private static Object createProxy(Object target) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                System.out.println("Proxy start...");
                Object result = proxy.invokeSuper(obj, args);
                System.out.println("Proxy stop...");
                return result;
            }
        });

        return enhancer.create();
    }
}

四、输出结果

Proxy start...
Listen: Main
Proxy stop...
Proxy start...
Say: hello
Proxy stop...