Spring AOP
- OOP:Object-Oriented Programming,面向对象编程;AOP:Aspect-Oriented Programming,面向切面编程
- Advisor:spring 自己的 AOP 组件;AspectJ :三方实现的 AOP 组件
- 原理是对目标 bean 创建代理对象,达到增强目的
- 如果目标 bean 实现了接口,就用 JDK 动态代理;如果没有,就用 CGLIB
- 如果有代理多次(多个切面类)可以通过 @Order 指定切面顺序,数值越小,越先生成代理类
- 两种连接点,分别是 JoinPoint 和 ProceedingJoinPoint,适用于不同的通知
- JoinPoint:获取连接点信息,比如方法、参数、目标对象等,可用于
@Before
、@After
、@AfterReturning
- ProceedingJoinPoint:是 JointPoint 的子接口,额外提供 proceed() 来执行目标方法,仅用于
@Around
- 声明式事务
@Transactional
注解底层就使用 AOP 实现事务提交回滚的
AspectJ VS Advisor
说人话 AspectJ 更强大、性能更好、可以不依赖 spring;总结就是:简单场景使用 Advisor,复杂场景使用 AspectJ。下面是两者详细对比
|
AspectJ |
Advisor |
定义 |
AspectJ 是一个完整的 AOP 框架,支持面向切面编程的编译时和运行时特性。 |
Advisor 是 Spring AOP 的一个概念,表示一个切面中的通知和切入点的组合。 |
编程模型 |
提供了丰富的语言支持,包括注解、XML 配置和代码注入。 |
主要通过注解(如 @Before , @After )或 XML 配置来定义。 |
切面实现 |
可以在编译时、类加载时或运行时进行织入,支持复杂的切点表达式。 |
主要通过 Spring 容器在运行时使用动态代理实现,切点表达式相对简单。 |
织入方式 |
支持编译时织入、类加载时织入和运行时织入。 |
仅支持运行时织入,通常使用 Java 动态代理或 CGLIB 代理。 |
切点表达式 |
使用 AspectJ 表达式,支持更复杂的匹配规则。 |
使用 Spring AOP 的切点表达式,功能相对有限。 |
应用范围 |
可用于任何 Java 应用,包括独立 Java 程序和 Spring 应用。 |
主要用于 Spring 应用中,与 Spring 生态系统紧密集成。 |
支持的通知类型 |
支持多种通知类型,如 @Before , @After , @Around , @AfterReturning , @AfterThrowing 。 |
支持 Before , After , Around 和其他通知类型,通常由 Advisor 定义。 |
性能 |
AspectJ 的性能较高,因为它可以在编译时进行优化。 |
Spring AOP 的性能相对较低,因为它依赖于运行时代理。 |
易用性 |
对于初学者来说,学习曲线可能较陡峭。 |
更加简单直观,易于上手。 |
AOP 概念
概念 |
定义 |
说人话 |
切面 (Aspect) |
定义了一个横切关注点的模块,包含通知和切入点。 |
就是我们定义的切面类 |
连接点 (Join Point) |
程序执行过程中一个可以插入通知的点,例如方法调用、方法执行、对象创建等。 |
目标对象所有方法 |
切入点 (Pointcut) |
定义在哪些连接点上应用通知的规则或表达式,决定通知的应用范围。 |
目标对象被增强的方法 |
通知 (Advice) |
在连接点上执行的行为,分为前置通知、后置通知、返回通知、异常通知和环绕通知。 |
|
织入 (Weaving) |
将切面与目标对象结合的过程,发生在编译时、类加载时或运行时。 |
将切点和通知组合的过程 |
目标对象 (Target Object) |
被切面影响的对象,通常是包含业务逻辑的类。 |
|
通知
通知类型 |
描述 |
前置通知 (Before) |
在连接点执行之前运行的通知(通知中如果 return,目标方法不会执行)。 |
后置通知 (After) |
在连接点执行之后运行的通知,通常在连接点成功或失败后都会执行。 |
返回通知 (After Returning) |
在连接点成功完成后执行的通知,可以访问连接点的返回值(目标方法执行不能发生异常)。 |
异常通知 (After Throwing) |
在连接点抛出异常时执行的通知,可以访问异常信息。 |
环绕通知 (Around) |
在连接点执行之前和之后都可以执行的通知,允许控制连接点的执行,能够选择不执行连接点的方法(这是一个四合一通知)。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具