当前位置: 首页 > article >正文

[Java]轻松掌握JDK和CGlib代理的使用技巧,让你的Java程序性能更卓越!

JDK代理与CGlib代理

是什么

JDK代理:JDK代理是一种基于接口的动态代理,它实现了被代理对象所实现的接口,可以在运行时通过反射的方式来生成代理对象。

CGlib代理:CGlib代理是一种基于类的动态代理,它通过生成被代理对象的子类来实现代理。因此,被代理对象不需要实现接口。

为什么

使用代理模式的主要目的是为了在不修改原始类的前提下,为其添加一些额外的功能。在实际开发中,我们经常需要在业务逻辑执行前后,增加一些日志记录、权限校验、事务管理等功能,这些功能与业务逻辑关系不大,但是又必须加入到业务逻辑中。这时就可以使用代理模式来解决这个问题。

怎么用

JDK代理
  1. 定义一个接口:
public interface UserService {
    void save(User user);
}
  1. 实现接口:
public class UserServiceImpl implements UserService {
    @Override
    public void save(User user) {
        System.out.println("保存用户信息:" + user);
    }
}
  1. 创建代理类,实现InvocationHandler接口:
public class UserServiceProxy implements InvocationHandler {
    // 被代理对象
    private Object target;

    public UserServiceProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行方法前...");
        Object result = method.invoke(target, args);
        System.out.println("执行方法后...");
        return result;
    }
}
  1. 测试:
public static void main(String[] args) {
    UserServiceImpl userService = new UserServiceImpl();
    UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),
            userService.getClass().getInterfaces(),
            new UserServiceProxy(userService));
    proxy.save(new User("Tom", 20));
}

输出结果:

执行方法前...
保存用户信息:User{name='Tom', age=20}
执行方法后...
CGlib代理
  1. 定义一个类:
public class UserService {
    public void save(User user) {
        System.out.println("保存用户信息:" + user);
    }
}
  1. 创建代理类,继承MethodInterceptor接口:
public class UserServiceProxy implements MethodInterceptor {
    // 被代理对象
    private Object target;

    public UserServiceProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("执行方法前...");
        Object result = method.invoke(target, args);
        System.out.println("执行方法后...");
        return result;
    }
}
  1. 测试:
public static void main(String[] args) {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(UserService.class);
    enhancer.setCallback(new UserServiceProxy(new UserService()));
    UserService proxy = (UserService) enhancer.create();
    proxy.save(new User("Tom", 20));
}

输出结果:

执行方法前...
保存用户信息:User{name='Tom', age=20}
执行方法后...

http://www.kler.cn/a/155687.html

相关文章:

  • C++常用的特性-->day05
  • Playwright——快速入门(初章)
  • openai Realtime API (实时语音)
  • 【Python】轻松解析JSON与XML:Python标准库的json与xml模块
  • 【初阶数据结构与算法】线性表之链表的分类以及双链表的定义与实现
  • 从0开始深度学习(25)——多输入多输出通道
  • C语言实战演练之贪吃蛇游戏
  • 【springboot】启动失败 Failed to start bean ‘webServerStartStop‘
  • Unity安装
  • Python生产者消费者模型
  • Zabbix 6.0 详细基础介绍
  • 充电桩新老国标兼容性分析
  • OpenCvSharp从入门到实践-(06)创建图像
  • 编译原理头歌实验:实验4《算符优先分析法设计与实现》(C语言版)
  • vue el-select封装及使用
  • Prefix-Tuning 论文概述
  • JAVA代码优化:记录日志
  • 使用AOS实现网页动画效果
  • 利用段落检索和生成模型进行开放域问答12.2
  • Spring Initial 脚手架国内镜像地址
  • C/C++学生选课/排课系统[2023-12-3]
  • 保育员个人简历精选7篇
  • C++笔试训练day_1
  • Linux网络之连接跟踪 conntrack
  • gitlab 代码提交账户信息修改
  • “大型”基础模型中幻觉的调查