目录
2. Join Point(连接点):演员表演的 “高光时刻”
在 Java 开发的广袤天地里,Spring 框架犹如一座巍峨的大厦,支撑起无数应用的构建与运行,而 Spring AOP(Aspect-Oriented Programming,面向切面编程)则是这座大厦中一抹灵动且强大的色彩,它为我们解决诸多横切关注点问题提供了优雅的方案。今天,就让我们一同深入探究 Spring AOP 的神秘世界,揭开它的面纱,看看其核心概念究竟如何具象化,又该如何在实际项目中施展 “魔法”。
一、Spring AOP 核心概念解读
1. Aspect(切面):舞台上的 “多面手” 之光
想象自己置身于一场华丽的舞台剧现场,灯光璀璨,演员们在台上演绎着精彩故事。Aspect 就如同那一束独特的光,不过它并非聚焦于某一个演员的一举一动,而是能够同时笼罩舞台上特定的一群演员或者某一特定场景区域。在代码世界里,Aspect 是一个封装了横切关注点逻辑的 Java 类,这些横切关注点往往游离于核心业务逻辑之外,却又在多个业务方法执行过程中频繁现身。比如,日志记录这个 “戏份” 贯穿于多个业务模块,无论是用户登录、商品查询还是订单提交等方法执行时,日志记录的 Aspect 就像一位恪尽职守的记录员,敏锐捕捉每个关键动作并记录在册,确保系统运行轨迹清晰可查。
2. Join Point(连接点):演员表演的 “高光时刻”
舞台上,演员的每一个举手投足、每一句台词吐露都是精彩瞬间,对应到程序中,Join Point 便是方法被调用执行的那一刻,是可以插入 Aspect 逻辑的 “黄金时机”。每当用户登录方法被触发、商品库存更新操作启动,这些方法执行的瞬间,就如同演员在舞台上的 “高光时刻”,成为了连接点。它们犹如一颗颗珍珠散落在业务代码的链条上,等待着 Aspect 这位 “能工巧匠” 按需镶嵌额外逻辑。
3. Pointcut(切入点):镜头下的 “精选画面”
倘若把所有连接点视作舞台上演员的全部表演时刻,那么 Pointcut 则是我们精心挑选、值得重点关注的那些片段。它通过特定表达式精准界定,恰似摄影师手中摄像机依据设定规则选定拍摄画面,比如 “仅捕捉以‘get’开头的方法执行瞬间”,这个规则所圈定的那些方法执行时刻,便是通过切点表达式定义的切入点,决定了 Aspect 逻辑究竟该在哪些业务方法处 “闪亮登场”。
4. Advice(通知):导演下达的 “行动指令”
在舞台剧幕后,导演会向工作人员下达各种指令,确保演出顺利且精彩。Advice 就如同导演给记录员(切面)的详细指示,明确在连接点(演员表演时刻)处,切面究竟要执行何种操作。常见的有 Before Advice(前置通知),仿若导演叮嘱记录员在演员上场前就得记下关键信息,在方法执行前做好准备工作,像权限校验前置通知可在业务方法调用前核验用户权限是否足够;After Returning Advice(后置通知),类似要求记录员在演员完美谢幕(方法正常返回)后,记录演出效果反馈,如记录业务方法成功执行后的返回值做数据分析;还有 After Throwing Advice(异常通知),当演员表演 “翻车”(方法抛出异常),记录员即刻按指令记录异常详情,方便后续故障排查。
5. Weaving(织入):魔法融合的 “幕后编排”
织入,无疑是将切面与业务代码巧妙融合的 “魔法” 环节,把 Aspect 逻辑丝丝入扣地嵌入目标对象(被代理对象)的过程,如同在演出筹备中将记录员(切面)精准安排到对应表演时刻,按导演指令(通知)开展工作。Spring AOP 提供了编译时织入、类加载时织入和运行时织入多种方式,恰似在不同阶段施展魔法,或在演出前剧本编排时(编译时织入)、演员候场准备时(类加载时织入),亦或是演出进行中(运行时织入)让切面与业务代码完美共舞。
二、Spring AOP 实战用法与代码示例
1. 项目环境搭建
首先,确保你的项目基于 Spring Boot 搭建(本文示例基于 Spring Boot 2.x 版本),在pom.xml
文件中引入必要依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
这一依赖包如同开启 Spring AOP 大门的钥匙,将核心组件引入项目,为后续切面功能实现铺就基石。
2. 定义 Aspect 切面类
创建一个 Java 类,标注@Aspect
注解,宣告其 “切面” 身份,同时可结合@Component
注解使其能被 Spring 容器管理。以下是一个简单日志记录切面示例:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
// 定义切入点,匹配com.example.demo包下所有类的所有方法
@Before("execution(* com.example.demo..*(..))")
public void logBeforeMethodExecution() {
System.out.println("即将执行方法,记录日志:[方法执行前]");
}
}
在上述代码中,@Before
注解搭配切点表达式execution(* com.example.demo..*(..))
,明确了这是一个前置通知,且作用于com.example.demo
包及其子包下所有类的所有方法,意味着只要目标方法被调用,控制台就会输出日志提示。
3. 验证切面功能
在com.example.demo
包下创建一个简单的业务类,例如:
import org.springframework.stereotype.Service;
@Service
public class UserService {
public void getUserInfo() {
System.out.println("获取用户信息");
}
}
编写测试类或者在项目启动后调用UserService
的getUserInfo
方法,你会惊喜发现控制台先输出 “即将执行方法,记录日志:[方法执行前]”,再执行 “获取用户信息”,这表明切面逻辑已成功织入业务方法,按预期发挥日志记录前置通知作用。
4. 拓展通知类型
若想丰富切面功能,添加后置通知记录方法返回值(假设方法有返回值情况),可修改切面类如下:
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.demo..*(..))")
public void logBeforeMethodExecution() {
System.out.println("即将执行方法,记录日志:[方法执行前]");
}
// 后置通知,记录方法返回值
@AfterReturning(pointcut = "execution(* com.example.demo..*(..))", returning = "result")
public void logAfterMethodExecution(Object result) {
System.out.println("方法执行完毕,返回值为:" + result);
}
}
相应修改业务类方法使其有返回值,再次调用测试,就能看到方法执行前后完整的日志记录,感受 Spring AOP 多类型通知协同编织代码 “防护网”,处理横切关注点的强大魅力。
Spring AOP 凭借其独特概念与灵活用法,宛如编程世界的瑞士军刀,巧妙化解日志记录、权限校验、事务管理等横切难题。通过理解核心概念、搭建实战环境、编写精妙切面代码,开发者得以在 Java 项目构建中优化代码结构、提升复用性与可维护性,让业务逻辑与通用功能泾渭分明又紧密协作,向着高效、优雅编程之路大步迈进。愿此番对 Spring AOP 的剖析,成为你编程行囊中的得力工具,助你攻克更多复杂开发场景。
标签:Spring,深入浅出,切面,Aspect,AOP,org,方法 From: https://blog.csdn.net/m0_57836225/article/details/144177440