spring核心-CGLIB动态代理应用及理解案例

概述:
cglib代理,就是运行时期对目标对象生成子类实现的代理:

  1. 要求目标对象不能为final,否则报错。
  2. 如果目标对象方法为final/static, 运行不报错,但不会被代理拦截,会直接调用目标对象的方法。
  3. cglib代理使用场景
    1. 目标有实现接口,最好使用jdk代理。
    2. 目标对象没有实现接口,最好使用cglib代理。
    3. cglib代理
      1. 可以应用于目标对象没有实现接口
      2. 目标对象有实现接口,也可以使用cglib代理。
        案例:
        需求:在运行时期,动态生成目标对象的子类。
        分析:
  4. 需要引入cglib支持包,spring-core核心包中已经包含了cglib的功能。所以引入spring-core就可以
  5. 目标对象不实现接口(可选)
  6. 测试
    实现代码:
    package com.itheima.proxy.c_dynamic_cglib;
    
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    
    public class App {
        public static void main(String[] args) {
            //1. 目标对象
            LiuDeHuaStar target = new LiuDeHuaStar();
    
            //2. 对目标对象生成代理(生成子类)
            LiuDeHuaStar proxy = (LiuDeHuaStar) Enhancer.create(LiuDeHuaStar.class, new MethodInterceptor() {
                @Override
                public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                    // 获取方法参数
                    Double money = (Double) args[0];
                    // 判断
                    if (money > 1000000){
                        // 执行目标对象的方法
                        return method.invoke(target,args);
                    } else {
                        System.out.println("档期忙,以后再合作!");
                    }
                    return null;
                }
            });
            // 查看生成的代理对象:class com..LiuDeHuaStar$$EnhancerByCGLIB$$151241e7
            System.out.println("查看生成的代理对象:" + proxy.getClass());
            //3. 访问代理方法
            proxy.act(1d);
            proxy.act(1000001d);
    
        }
    }
    

谢谢阅读!

上一篇:什么是基于注解的切面实现


下一篇:spring中的aop