• 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
    方法执行之后

  • 相关阅读:
    阶段总结与展望——我的简历
    Polygon Miden VM架构总览
    Android/AutoMotive 多用户操作
    计算机毕业设计(附源码)python智慧停车系统
    如何使用 ChatGPT 指令大全
    [machineLearning]非监督学习unsupervised learning
    【linux】保存一份进程监视命令
    SSM整合案例分析(详解)
    基于Windows 的 VS Code C/C++ 编译环境搭建
    API接口怎么使用(教你使用api接口获取数据)
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127700386