AspectJ、Spring AOP 与 Solon AOP:Java AOP 框架的三剑客
在 Java 企业级应用开发中,面向切面编程(AOP)是解决横切关注点(如日志、事务、安全等)的核心技术。它允许我们将这些通用功能从业务逻辑中分离出来,实现更高的模块化和代码复用。然而,不同的生态提供了不同的AOP实现。本文将深入比较三位“主角”:老牌王者 AspectJ、生态霸主 Spring AOP 与 后起之秀 Solon AOP。
一、 特性对比
| 特性 | AspectJ | Spring AOP | Solon AOP |
|---|---|---|---|
| 实现机制 | 字节码织入(Bytecode Weaving):通过修改目标类的字节码来实现 AOP。 | 动态代理(Dynamic Proxy):运行时为目标对象生成代理对象。 | 动态代理(Dynamic Proxy):运行时为目标对象生成代理对象。 |
| 织入方式 | 编译时织入 (CTW)、加载时织入 (LTW)、运行时织入 (RTW)。 | 运行时织入(Proxy Generation)。 | 运行时织入(Proxy Generation)。 |
| 功能范围 | 全功能 AOP。可以拦截几乎所有连接点。 | 简化的 AOP,主要用于解决企业级应用中的常见横切关注点。 | 更简化的 AOP,只专注基于“注解”的拦截。 |
| 可拦截的 连接点 (Join Point) | 最全面:方法调用、方法执行、字段访问、构造器执行、异常处理等。 | 仅限方法执行:只能拦截 Spring IoC 容器中 Bean 的方法。 | 仅限方法执行:只能拦截 Solon IoC 容器中 Bean 的公有方法。 |
| 切入点定义 | AspectJ 表达式:功能强大、语法复杂,支持所有连接点类型。 | AspectJ 表达式子集:使用 AspectJ 的语法,但仅支持与方法执行相关的表达式(如 execution())。 |
纯注解驱动:不使用 AspectJ 表达式,切入点仅由 @Around(MethodInterceptor.class) 等自定义注解确定。 |
| 侵入性 (Intrusiveness) | 最低:通过表达式可以实现对第三方库或无注解代码的完全无侵入增强。 | 中低:可以使用表达式实现无侵入,也可以使用注解 (@Transactional) 实现侵入式。 |
高:纯侵入式。必须在目标类或方法上添加自定义 AOP 注解才能生效。 |
| 依赖关系 | 独立于框架,需要配置专门的编译器或 Agent。 | 完全集成于 Spring 框架。 | 完全集成于 Solon 框架。 |
| 典型应用 | 性能监控(精确到字段访问)、非 IoC 管理对象的增强。 | 事务管理 (@Transactional)、方法级安全、缓存 (@Cacheable)、日志。 |
事务、日志、缓存等(通过自定义注解实现)。 |
关键点解析:
- AspectJ 的强大在于其“无孔不入”,你可以拦截一个字段的赋值,也可以在一个对象构造时执行逻辑,这是其他两者做不到的。
- Spring AOP 和 Solon AOP 都是容器级AOP,它们的设计初衷是为管理在容器中的Bean提供AOP能力,简单而实用。
二、 详细说明
1、纯 AspectJ:
纯 AspectJ 是最强大、最完整的 AOP 解决方案。
- 机制与能力: 它通过在编译期 (CTW) 或类加载期 (LTW) 直接修改目标类的字节码(Weaving/织入)来实现 AOP。这意味着它可以影响代码的每一个角落:私有方法、静态方法、构造器,甚至对成员变量的读取和写入。
- 适用场景: 当你需要对非 IoC 容器管理的普通 Java 对象、第三方库代码进行增强,或者需要拦截方法执行之外的连接点(如字段访问)时,必须使用 AspectJ 的字节码织入。
2、Spring AOP:
Spring AOP 并没有使用 AspectJ 的字节码织入技术(除非你显式配置 Spring LTW),而是基于 动态代理。
- 机制与限制: 它在运行时为目标 Bean 创建一个代理对象。所有对目标 Bean 的调用,实际上都是通过这个代理对象进行的。
- 限制: 这种代理机制只能拦截公有方法(因为私有方法和构造器不能被代理),并且只能拦截方法执行(不能拦截字段访问等)。
- 切入点: 尽管它使用了 AspectJ 的表达式语法(如
execution(* com.xxx.service.*.*(..))),但它只能处理与方法执行相关的表达式。 - 优势: 与 Spring 框架高度集成,配置简单,是 Spring 声明式事务等核心功能的基础。
3、Solon AOP:
Solon AOP 是 Solon 框架自带的 AOP 实现,它的设计目标是简洁和轻量。
- 机制与限制: 和 Spring AOP 类似,它也是基于动态代理实现的,因此也只能拦截 Solon Bean 的方法执行。
- 切入点: 这是 Solon AOP 最主要的区别。它不使用复杂的 AspectJ 表达式,而是要求开发者通过 自定义注解 来定义切入点,并通过
@Around(MethodInterceptor.class)来绑定拦截逻辑。 - 优势: Solon AOP 更加直观明确(高透明性)。只要在代码上看到 @XXX 注解,就知道它被 AOP 增强了,这使得代码更容易理解和维护。但代价是它必须是侵入式的。
三、 使用体验与代码风格
1、AspectJ
- 需要引入额外依赖。
- 可以使用基于注解的风格(更现代)或原生 AspectJ 语言风格。
- 需要配置构建工具(Maven/Gradle)使用 ajc 编译器,或配置 LTW Java Agent。
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("即将执行: " + joinPoint.getSignature().getName());
}
}
public class com.example.service {
public void demo(){...}
}
2、Spring AOP:
- 可以使用基于注解的风格或 AspectJ 语言风格。
- 与 Spring 生态完美融合。学习和使用成本最低。
@Aspect
@Component // 作为一个Spring组件
public class LoggingAspect {
// 切点表达式与AspectJ相同
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
// ...
}
}
@Component
public class com.example.service {
public void demo(){...}
}
3、Solon AOP:
- 只能使用注解风格
- 与 Solon 生态完美融合。透明可见(有一定侵入性)。
class LogInterceptor implements MethodInterceptor {
@Override
public Object doIntercept(Invocation inv) throws Throwable {
System.out.println("log: ...");
return inv.invoke();
}
}
@Around(Log.LogInterceptor.class)
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
}
@Component
public class com.example.service {
@Log
public void demo(){...}
}
四、选择建议:
如果你的项目是 Spring 的天下,并且需求是标准的业务方法增强,Spring AOP 是你的不二之选,简单够用。
如果你追求 极致的性能和无与伦比的灵活性,不畏惧复杂的配置,AspectJ 是终极武器。它甚至可以与 Spring 或 Solon 结合使用(Spring 支持使用 AspectJ 作为 AOP 实现)。
如果你的技术选型偏向于 轻量、快速和高性能的国产框架,或者正在构建新的云原生应用,Solon AOP 会为你带来惊喜,它提供了一个在功能和易用性之间取得很好平衡的现代化解决方案。
AspectJ、Spring AOP 与 Solon AOP:Java AOP 框架的三剑客的更多相关文章
- Java AOP nested exception is java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice || Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0' 两个异常解决办法
贴出applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...
- 【Java】Spring之面向方面编程(AOP)(五)
面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP).OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面.方面实现了跨越多种类型和对象的关注点(例如事务管理)的 ...
- Java AOP - Aspectj
1. 序 Aspect Oriented Programming (AOP)是近来一个比较热门的话题. AspectJ是AOP的Java语言的实现,获得了Java程序员的广泛关注. 关于AspectJ ...
- 开发Spring过程中几个常见异常(三):java.lang.ClassCastException: com.sun.proxy.$Proxy4 cannot be cast to com.edu.aop.ArithmeticCalculatorImpl at com.edu.aop.Main.main(Main.java:11)
这个异常是在开发Spring案例时遇到的. 贴一下完整异常信息: Exception in thread "main" java.lang.ClassCastException: ...
- Java面试题_第三阶段(Spring、MVC、IOC、AOP、DI、MyBatis、SSM、struts2)
1.1 何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗? 答:1)用于创建bean对象,管理bean对象的那个容器. 2)Spring IOC 容器 ...
- 菜鸟学习Spring——60s使用annotation实现简单AOP
一.概述. AOP大家都知道切面编程,在Spring中annotation可以实现简单的AOP列子.下面还未大家介绍几个概念: Aspect 对横切性关注点的模块化. Advice 对横切性关注点的具 ...
- JavaEE开发之Spring中的依赖注入与AOP
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- Spring详解(六)------AOP 注解
上一篇博客我们讲解了 AspectJ 框架如何实现 AOP,然后具体的实现方式我们是通过 xml 来进行配置的.xml 方式思路清晰,便于理解,但是书写过于麻烦.这篇博客我们将用 注解 的方式来进行 ...
- Spring(4)——面向切面编程(AOP模块)
Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...
- Spring之旅第五篇-AOP详解
一.什么是AOP? Aspect oritention programming(面向切面编程),AOP是一种思想,高度概括的话是“横向重复,纵向抽取”,如何理解呢?举个例子:访问页面时需要权限认证,如 ...
随机推荐
- 攻克大模型训练网络瓶颈,天翼云论文获ACM ICS顶会收录!
近日,由天翼云公有云事业部联合基础架构事业部所撰写的论文<CTCCL: Cost-Efficient Joint Device-Network Load Balancing for LLM Tr ...
- 梦熊星航计划六月份CSP-S全真模拟赛总结
最大公因数 1.算法思想维度 问题类型:博弈DP 错误原因:数组开小,RE了 2.实现细节维度 代码框架 int S(int x, int g) { if (x == n) return 0; if ...
- 软件无线电系统 高速图像采集卡 设计原理图: 613-基于6UVPX C6678+XCVU9P的信号处理板卡
基于6UVPX C6678+XCVU9P的信号处理板卡一.板卡概述 板卡基于6U VPX标准结构,包含一个C6678 DSP芯片,一个XCVU9P 高性能FPGA,双路HPC FMC. 二.处理板技术 ...
- 创新突破!天翼云TeleDB数据库通过中国信通院数据库迁移工具专项测试
近日,天翼云数据传输服务软件(DTS)依据<数据库迁移工具能力要求>,结合天翼云TeleDB数据库产品,顺利通过中国信息通信研究院(简称"中国信通院")"可信 ...
- 还在发愁怎么配置VSCode?一篇文章教会你!
注:或许该文章更加适合算法竞赛选手,本文章推荐的配置方法比较偏向于算法竞赛选手风格.并且,Win7 及以下的用户请跳过,因为这不适用于 Win7 及以下版本. 由于算法竞赛常用语言为 c++ 语言,因 ...
- [Alibaba微服务技术入门]_Sentinel服务熔断_第17讲
Sentinel的 block 机制是专门处理限流规则,降级规则,热点参数规则.但是当系统内部出现异常,比如:NullPointerException,IIlegalArgumentException ...
- 软件神器 --- 安卓文件管理和逆向双修之王 mt管理器
# MT Manager 克隆 - 开发计划 本文件概述了开发一个与 MT Manager 功能相似的应用程序的开发计划. ## 1. 功能分析 **A. 基本文件管理*** **双窗格视图**:并排 ...
- 一家安卓手机上的猎豹清理大师、mt管理器闪退
问题现象:打开猎豹清理大师开始清理,开始正常,之后到安装包搜索完成后,就卡住不动了,之后就退出了.mt管理器在安装包提取功能页面也有类似现象. 问题原因:闪退的原因基本上可以确定了,是因为我手机安装了 ...
- discuz列表页不显示
显示基于3点 1.模板文件list.htm 2.后台模板配置 3.diy模板
- 基于遗传优化算法的带时间窗多车辆路线规划matlab仿真
1.程序功能描述 基于遗传优化算法的带时间窗多车辆路线规划matlab仿真,通过输入各个节点坐标,以及出发点到节点的时间窗,来进行优化,输出最优的路线规划结果. 2.测试软件版本以及运行结果展示MAT ...