AOP

作者: zhemehao819 | 来源:发表于2022-04-04 15:42 被阅读0次

    一、实现方式

    1. AOP 实现之 ajc 编译器

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

    2. AOP 实现之 agent 类加载

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

    3. AOP 实现之 proxy代理

    • jdk动态代理
    • cglib 代理

    二、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();
        }
    }
    
    • cglib 不要求目标实现接口,它生成的代理类是目标的子类,因此代理与目标之间是子父关系
    • final 类无法被 cglib 增强

    相关文章

      网友评论

          本文标题:AOP

          本文链接:https://www.haomeiwen.com/subject/hvucsrtx.html