AOP

2022-04-04  本文已影响0人  zhemehao819

一、实现方式

1. AOP 实现之 ajc 编译器

在编译时期,通过使用ajc编译器对class文件进行修改增强功能。

2. AOP 实现之 agent 类加载

在类加载时期,通过 agent 修改 class 实现增强。

3. AOP 实现之 proxy代理

二、JDK动态代理

样例

public class JdkProxyDemo {

    interface Foo {
        void foo();
    }

    static class Target implements Foo {
        public void foo() {
            System.out.println("target foo");
        }
    }

    public static void main(String[] param) {
        // 目标对象
        Target target = new Target();
        // 代理对象
        Foo proxy = (Foo) Proxy.newProxyInstance(
                Target.class.getClassLoader(), new Class[]{Foo.class},
                (p, method, args) -> {
                    System.out.println("proxy before...");
                    Object result = method.invoke(target, args);
                    System.out.println("proxy after...");
                    return result;
                });
        // 调用代理
        proxy.foo();
    }
}

运行结果

proxy before...
target foo
proxy after...

jdk 动态代理要求目标**必须**实现接口,生成的代理类实现相同接口,因此代理与目标之间是平级兄弟关系

三、cglib 代理

样例

public class CglibProxyDemo {

    static class Target {
        public void foo() {
            System.out.println("target foo");
        }
    }

    public static void main(String[] param) {
        // 目标对象
        Target target = new Target();
        // 代理对象
        Target proxy = (Target) Enhancer.create(Target.class, 
                (MethodInterceptor) (p, method, args, methodProxy) -> {
            System.out.println("proxy before...");
            Object result = methodProxy.invoke(target, args);
            // 另一种调用方法,不需要目标对象实例
//            Object result = methodProxy.invokeSuper(p, args);
            System.out.println("proxy after...");
            return result;
        });
        // 调用代理
        proxy.foo();
    }
}
上一篇下一篇

猜你喜欢

热点阅读