Hutool - AOP:JDK 动态代理封装与非 IOC 下的切面支持

ops/2025/2/18 23:03:14/
1. 什么是 Hutool - AOP

在 Java 开发中,面向切面编程(AOP)是一种强大的编程范式,它允许我们在不修改原有业务逻辑的基础上,对程序进行增强,比如添加日志记录、事务管理等功能。Hutool - AOP 是 Hutool 工具包中的一个模块,它对 JDK 动态代理进行了封装,为我们提供了在非 Spring IOC 环境下使用切面的能力。

2. 引入依赖

如果你使用 Maven 项目,在 pom.xml 中添加以下依赖:

 
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>

3. 基本使用示例

下面通过一个简单的示例来展示如何使用 Hutool - AOP 实现切面功能。

3.1 定义接口和实现类

首先,定义一个接口和它的实现类,这是我们的业务逻辑类。

 
java">// 定义接口
interface UserService {void saveUser(String username);
}// 实现接口
class UserServiceImpl implements UserService {@Overridepublic void saveUser(String username) {System.out.println("保存用户: " + username);}
}

3.2 定义切面类

接下来,定义一个切面类,该类实现 InvocationHandler 接口,用于在目标方法执行前后添加额外的逻辑。

 
java">import cn.hutool.aop.ProxyUtil;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;// 切面类
class UserServiceAspect implements InvocationHandler {private final Object target;public UserServiceAspect(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 在目标方法执行前添加逻辑System.out.println("开始保存用户,准备记录日志...");// 调用目标方法Object result = method.invoke(target, args);// 在目标方法执行后添加逻辑System.out.println("用户保存成功,日志记录完成。");return result;}
}

3.3 使用 Hutool - AOP 创建代理对象

最后,使用 Hutool - AOP 的 ProxyUtil 工具类创建代理对象,并调用代理对象的方法。

 
java">public class Main {public static void main(String[] args) {// 创建目标对象UserService userService = new UserServiceImpl();// 创建切面对象UserServiceAspect aspect = new UserServiceAspect(userService);// 使用 Hutool - AOP 创建代理对象UserService proxyUserService = (UserService) ProxyUtil.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(),aspect);// 调用代理对象的方法proxyUserService.saveUser("张三");}
}

4. 代码解释
  • 接口和实现类UserService 接口定义了业务方法 saveUserUserServiceImpl 类实现了该接口,包含具体的业务逻辑。

  • 切面类UserServiceAspect 类实现了 InvocationHandler 接口,在 invoke 方法中,我们可以在目标方法执行前后添加额外的逻辑,如日志记录。

  • 创建代理对象:使用 ProxyUtil.newProxyInstance 方法创建代理对象,该方法需要传入类加载器、接口数组和切面对象。

  • 调用代理对象的方法:调用代理对象的方法时,实际上会触发切面类的 invoke 方法,从而实现切面功能。

5. 优势和适用场景
  • 优势:Hutool - AOP 封装了 JDK 动态代理,使用简单,无需依赖 Spring IOC 容器,降低了项目的复杂度。

  • 适用场景:适用于小型项目或不使用 Spring 框架的项目,需要在非 IOC 环境下实现切面功能的场景。

通过使用 Hutool - AOP,我们可以方便地在非 IOC 环境下实现切面编程,为程序添加额外的功能,提高代码的可维护性和可扩展性。

学习更多相关技术知识

偷偷的学Java

Java业务系统应用技术


http://www.ppmy.cn/ops/158773.html

相关文章

算法08-递归调用转为循环的通用方法

前导:问题引入 在Python中,递归调用过多会导致“递归深度过深”的错误,通常是因为递归没有正确终止条件或者递归层次太深。 这种错误通常会导致程序抛出 RecursionError 异常。 Python默认的递归深度限制大约是1000层(可以通过sys.getrecursionlimit()查看)。 修正方式…

|网络安全|网络安全学习方法

1、先网络后安全 很多初学者还没搞定网络看懂网络拓扑&#xff0c;就急着研究防火墙或VPN&#xff0c;其实这样就不清楚整个网络架构是如何安全演进的。正确的流程是&#xff1a;先通过网络协议和拓扑设计的学习&#xff0c;能独立搭建一个企业网/校园网&#xff0c;再引入局域…

【DeepSeek】DeepSeek R1 本地windows部署(Ollama+Docker+OpenWebUI)

1、背景&#xff1a; 2025年1月&#xff0c;DeepSeek 正式发布 DeepSeek-R1 推理大模型。DeepSeek-R1 因其成本价格低廉&#xff0c;性能卓越&#xff0c;在 AI 行业引起了广泛关注。DeepSeek 提供了多种使用方式&#xff0c;满足不同用户的需求和场景。本地部署在数据安全、性…

PHP处理大文件上传

前段HTML代码如下: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>分块上传大文件</title> </head> <body><input type"file" id"fileInput"><butt…

深度学习与增强现实的完美邂逅:开启未来智能交互的新篇章

深度学习与增强现实的完美邂逅:开启未来智能交互的新篇章 近年来,随着深度学习和增强现实(AR)技术的飞速发展,二者的结合应用正逐步改变着我们的生活方式。从智能驾驶到医疗诊断,再到游戏娱乐,深度学习为增强现实提供了强大的算法支持,而增强现实则为深度学习提供了丰…

javaEE初阶————多线程初阶(4)

8.1 单例模式 这又是什么新的神奇玩意呢&#xff0c;我们先不谈单例模式&#xff0c;先来谈谈设计模式&#xff0c;什么是设计模式呢&#xff0c;我们只需要用设计模式就好了&#xff0c;而大佬们考虑的就多了&#xff0c;这些设计模式就像棋谱&#xff0c;只要按照棋谱来下&am…

无人机尾座垂起逻辑自洽问题概述!

一、设计原理的自洽性 尾座式垂直起降无人机结合了固定翼和旋翼两种飞行模式&#xff0c;以实现垂直起降和高速平飞的功能。这种设计原理本身是自洽的&#xff0c;因为它充分利用了固定翼的高速飞行能力和旋翼的垂直起降能力&#xff0c;从而满足了无人机在不同场景下的应用需…

共用poetry和conda的方法

起因 基于开源项目继续开发&#xff0c;发现该项目使用poetry管理依赖&#xff0c;但本地开发及调试环境依赖conda且未安装原生python&#xff0c;不支持直接安装poetry&#xff0c;因此需要使用conda安装及使用poetry。操作系统&#xff1a;Ubuntu 什么是poetry 一项依赖于…