• Spring 如何实现一个CGLlB动态代理呢?


    转自:

    Spring 如何实现一个CGLlB动态代理呢?

    CGLIB简介说明

    CGLIB:(Code Generation Library)是一个高性能开源的代码生成包,
    它应用于许多AOP框架中,
    其底层是通过使用一个小而快的字节码处理框架 ASM(Java 字节码操控框架)转换字节码并生成新的类


    CGLIB使用注意事项

    使用 CGLIB 需要导入 CGLIB 和 ASM 包,即 asm-x.x.jar 和 CGLIB-x.x.x.jar
    如果您已经导入了 Spring 的核心包 spring-core-x.x.x.RELEASE.jar
    就不用再导入 asm-x.x.jar 和 cglib-x.x.x.jar 了
    因为 Spring 核心包中包含 CGLIB 和 asm,即Spring 核心包已集成CGLIB 所需要的包
    所以在开发中不需要另外导入asm-x.x.jar 和 cglib-x.x.x.jar 包了。

    1. 创建 SpringDemo 项目
    2. 在src 目录下创建 com.java265 包
    3. 导入相关 JAR 包
    4. 在 com.java265 包下创建 UserManager(用户管理接口)、UserManagerImpl(用户管理接口实现类)、MyAspect(切面类)和 CGLIBProxy(动态代理类)
    5. 运行 SpringDemo 项目

    UserManager 类

    package com.java265;
    public interface UserManager {
       
        // 新增用户抽象方法
        void addUser(String userName, String password);
        // 删除用户抽象方法
        void delUser(String userName);
    }
    
    

    UserManagerImpl 类

    package com.java265;
    public class UserManagerImpl implements UserManager {
        @Override
        public void addUser(String userName, String password) {
            System.out.println("正在执行添加用户方法");
            System.out.println("用户名称: " + userName + " 密码: " + password);
        }
        @Override
        public void delUser(String userName) {
            System.out.println("正在执行删除用户方法");
            System.out.println("用户名称: " + userName);
        }
    }
    

    MyAspect 类

    package com.java265;
    public class MyAspect {
        public void myBefore() {
            System.out.println("方法执行之前");
        }
        public void myAfter() {
            System.out.println("方法执行之后");
        }
    }
    

    CglibProxy 类

    package com.java265;
    import java.lang.reflect.Method;
    import org.springframework.CGLIB.proxy.Enhancer;
    import org.springframework.CGLIB.proxy.MethodInterceptor;
    import org.springframework.CGLIB.proxy.MethodProxy;
    /**
    * CGLIB动态代理,实现MethodInterceptor接口
    *
    * @author 编程帮
    *
    */
    public class CglibProxy implements MethodInterceptor {
        private Object target;// 需要代理的目标对象
        final MyAspect myAspect = new MyAspect();
        // 重写拦截方法
        @Override
        public Object intercept(Object obj, Method method, Object[] arr, MethodProxy proxy) throws Throwable {
            myAspect.myBefore();
            Object invoke = method.invoke(target, arr);// 方法执行,参数:target目标对象 arr参数数组
            myAspect.myAfter();
            return invoke;
        }
        // 定义获取代理对象方法
        public Object getCglibProxy(Object objectTarget) {
            // 为目标对象target赋值
            this.target = objectTarget;
            Enhancer enhancer = new Enhancer();
            // 设置父类,因为CGLIB是针对指定的类生成一个子类,所以需要指定父类
            enhancer.setSuperclass(objectTarget.getClass());
            enhancer.setCallback(this);// 设置回调
            Object result = enhancer.create();// 创建并返回代理对象
            return result;
        }
        public static void main(String[] args) {
            CglibProxy cglib= new CglibProxy();// 实例化CglibBProxy对象
            UserManager user = (UserManager) cglib.getCglibProxy(new UserManagerImpl());// 获取代理对象
            user.addUser("java265.com", "www.java265.com"); // 执行新增方法
            user.delUser("java265.com"); // 执行删除方法
        }
    }
    

    运行结果---
    方法执行之前
    正在执行添加用户方法
    用户名称: java265.com 密码: www.java265.com
    方法执行之后
    方法执行之前
    正在执行删除用户方法
    用户名称: java265.com
    方法执行之后

  • 相关阅读:
    第2关:遗传算法 - 函数最优解计算
    Springboot 实践(19)负载平衡配置与运用
    内部错误: !scandr.cpp@815: eWasOpenForWrite
    Node学习笔记之MongoDB
    知识点滴 - 什么是YAML文件
    5-硝基-二乙酸荧光素,CAS号: 14926-29-5
    Linux 之 JavaEE 定制篇-搭建 JavaEE 环境
    FANUC机器人实现本地自动运行的相关配置和参数设置
    springboot+vue+elementUI 广场舞团高校舞蹈社团管理系统-#毕业设计
    RocketMQ的tag过滤和sql过滤
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127700386