Spring 高级 AOP 实现之proxy增强-cglib

一、代码

package com.mangoubiubiu.show.a12;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;

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("before...");
            //Object result = method.invoke(target,args); //用方法反射调用目标
            //
//            Object result = methodProxy.invoke(target, args);//内部没有用反射  Spring用的是这种
            Object result =  methodProxy.invokeSuper(p,args);//内部没有用反射 需要代理

            System.out.println("after...");
            return result;
        });

        // 调用代理
        proxy.foo();
    }
}

运行结果与 jdk 动态代理相同

收获💡

  • cglib 不要求目标实现接口,它生成的代理类是目标的子类,因此代理与目标之间是子父关系
  • 限制⛔:根据上述分析 final 类无法被 cglib 增强
posted @ 2022-09-24 16:25  KwFruit  阅读(47)  评论(0编辑  收藏  举报