10月17日,据人民网,小米集团合伙人、总裁卢伟冰在访谈中回应小米17系列正面交锋iPhone17,“对苹果我们一直是非常尊敬的,我觉得它真的是一个非...
2025-10-21 0
Spring AOP和 AspectJ 是工作中经常使用的两个的 AOP框架,那么,它们是如何工作的?两者之间有什么区别?我们该如何选择?这篇文章来聊一聊。
Spring AOP,全称 Aspect-Oriented Programming,中文翻译为面向切面编程,主要是基于代理模式来实现面向切面编程。其核心原理包括 3个步骤:
AspectJ 是一个功能更强大的 AOP 框架,提供了更丰富的切面功能和更灵活的织入机制。其实现原理也包括 3个步骤:
在分析完 Spring AOP和 AspectJ 的工作原理之后,我们来看看两者的区别。关于 Spring AOP和 AspectJ的区别,可以总结成下表:
特性 | Spring AOP | AspectJ |
实现方式 | 基于动态代理(JDK代理或CGLIB) | 基于字节码织入(编译时、类加载时、二进制) |
切点范围 | 主要面向方法级别的连接点 | 支持方法、构造方法、字段、异常等多种连接点 |
织入时机 | 运行时通过代理实现 | 编译时、类加载时或二进制后期织入 |
性能 | 由于使用代理,性能开销相对较小,但功能有限 | 由于织入在编译或类加载时完成,运行时性能更优,功能更强大 |
功能丰富度 | 提供基本的AOP功能,如前置、后置、环绕通知 | 提供更丰富的AOP功能,包括更复杂的切点表达式和连接点类型 |
使用复杂度 | 易于集成和使用,特别是在Spring应用中 | 相对复杂,需要了解更多的织入机制和配置 |
适用场景 | 适合大多数常见的AOP需求,如事务管理、日志记录等 | 适合需要更深入和复杂AOP功能的场景,如底层框架开发、对非Spring管理对象进行增强等 |
为了更好地理解 Spring AOP 和 AspectJ,下面我们以如何进行日志记录为例,展示两者的实现。
步骤:
<dependencies> <!-- Spring AOP --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.3.23</version> </dependency> <!-- AspectJ Weaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.19</version> </dependency></dependencies>
package com.yuanjava.service;public class UserService { public void addUser(String name) { System.out.println("Add user: " + name); }}
package com.yuanjava.aspect;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;@Aspectpublic class LoggingAspect { @Before("execution(* com.yuanjava.service.UserService.addUser(..))") public void logBefore() { System.out.println("Add log before method"); }}
package com.yuanjava.config;import com.example.aspect.LoggingAspect;import com.example.service.UserService;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration@EnableAspectJAutoProxy// 启用AOP自动代理publicclass AppConfig { @Bean public UserService userService() { returnnew UserService(); } @Bean public LoggingAspect loggingAspect() { returnnew LoggingAspect(); }}
package com.yuanjava;import com.yuanjava.config.AppConfig;import com.yuanjava.service.UserService;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AOPSpringDemo { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); UserService userService = context.getBean(UserService.class); userService.addUser("猿java"); context.close(); }}
输出:
Add log before methodAdd user: 猿java
步骤:
<dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.19</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>1.9.19</version> </dependency></dependencies>
package com.yuanjava.service;public class UserService { public void addUser(String name) { System.out.println("Add user: " + name); }}
package com.yuanjava.aspect;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;@Aspectpublic class LoggingAspect { @Before("execution(* com.yuanjava.service.UserService.addUser(..))") public void logBefore() { System.out.println("Add log before method"); }}
假设项目结构如下:
src/├── com/yuanjava/service/UserService.java├── com/yuanjava/aspect/LoggingAspect.java
运行以下命令进行编译和织入:
ajc -1.8 -d bin -sourcepath src src/com/yuanjava/service/UserService.java src/com/yuanjava/aspect/LoggingAspect.java
package com.yuanjava;import com.yuanjava.service.UserService;public class AspectJDemos { public static void main(String[] args) { UserService userService = new UserService(); userService.addUser("猿java"); }}
输出:
Add log before methodAdd user: 猿java
从整体来看,Spring AOP的使用场景可以包含以下几个方面:
从整体来看,AspectJ的使用场景可以包含以下几个方面:
适用理由:AspectJ 提供更强大的 AOP 功能和更灵活的织入机制,适用于需要精细控制切面织入时机和范围的复杂应用。
本文,我们分析了 Spring AOP 和 AspectJ 的实现原理,并且通过示例展示了两者如如何使用它们。
在实际业务中,选择哪种 AOP框架取决于项目的具体需求和团队的技术栈选择,作为 Java程序员,强烈建议掌握两者的工作原理。
相关文章
10月17日,据人民网,小米集团合伙人、总裁卢伟冰在访谈中回应小米17系列正面交锋iPhone17,“对苹果我们一直是非常尊敬的,我觉得它真的是一个非...
2025-10-21 0
中新网西安10月20日电 (阿琳娜 陈圆 第二十三届中国MBA发展论坛19日在西安开幕,来自全国多所高校的专家学者、领军企业的管理精英、MBA师生及校...
2025-10-21 0
美国南加州大学(USC)工程师团队近日展示了一种新型光学器件,这种器件能够让光线依照热力学原理“自行组织”传播路径,有望推动计算与通信领域的全新变革。...
2025-10-21 0
1 项目服务需求理解1.1 项目服务内容1.1.1 项目服务内容范围1.1.2 设备故障修复服务1.1.3 电话技术支持服务1.1.4 版本管理和软件...
2025-10-21 0
Spring AOP和 AspectJ 是工作中经常使用的两个的 AOP框架,那么,它们是如何工作的?两者之间有什么区别?我们该如何选择?这篇文章来聊...
2025-10-21 0
东港发布2025-10-20 17:32:44更多新闻 尽在“东港发布”视频号逐日追梦 “播”种未来 山东省青年创业导师交流营暨2025 日照市青年电...
2025-10-21 0
亚马逊根据SIE《战神》系列游戏改编的真人剧集,其选角信息在网络上被泄露,让粉丝们对该剧的方向和基调有了初步了解。 根据泄露的细节,这部改编自2018...
2025-10-21 0
#头条创作嘉年华#根据装机总预算守恒定律,今年双11存储件大涨的同时显卡价格有所下探,不管是游戏玩家,还是有生产力需求,趁着大促换卡会是个不错的选择。...
2025-10-21 0
发表评论