首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
AOP引入:OOP存在哪些局限性?
AOP常见使用场景
AOP概念:Aspect、Join Point和Advice等术语应该如何理解?
Java AOP设计模式:代理、判断和拦截器模式
Java AOP代理模式(Proxy):Java静态代理和动态代理的区别是什么?
Java AOP判断模式(Predicate):如何筛选Join Point?
Java AOP拦截器模式(Interceptor):拦截执行分别代表什么?
Spring AOP 功能概述:核心特性、编程模型和使用限制
Spring AOP编程模型:注解驱动、XML配置驱动和底层API
Spring AOP设计目标:Spring AOP与 AOP框架之间的关系是竞争还是互补?
Spring AOP Advice类型:Spring AOP丰富了哪些AOP Advice呢?
Spring AOP代理实现:为什么Spring Framework选择三种不同AOP实现?
JDK动态代理:为什么Proxy.newProxyInstance会生成新的字节码?
CGLIB动态代理:为什么Java动态代理无法满足AOP的需要?
AspectJ代理代理:为什么Spring推荐AspectJ注解?
AspectJ基础:Aspect、Join Points、Pointcuts和Advice语法和特性
AspectJ注解驱动:注解能完全替代AspectJ语言吗?
Spring核心基础:《小马哥讲Spring核心编程思想》还记得多少?
@AspectJ注解驱动
编程方式创建 @AspectJ代理
XML配置驱动 - 创建AOP代理
标准代理工厂API - ProxyFactory
@AspectJ Pointcut指令与表达式:为什么Spring只能有限支持?
XML配置Pointcut
API实现Pointcut
@AspectJ拦截动作:@Around与@Pointcut有区别吗?
XML配置Around Advice
API实现Around Advice
@AspectJ前置动作:@Before与@Around谁优先级执行?
XML配置Before Advice
API实现Before Advice
@AspectJ后置动作 - 三种After Advice之间的关系?
XML配置三种After Advice
API实现三种After Advice
自动动态代理
替换TargetSource
Spring AOP API整体设计
接入点接口 - Joinpoint
Joinpoint条件接口 - Pointcut
Pointcut操作 - ComposablePointcut
Pointcut便利实现
Pointcut AspectJ实现 - AspectJExpressionPointcut
Joinpoint执行动作接口 - Advice
Joinpoint Before Advice标准实现
Joinpoint Before Advice AspectJ实现
Joinpoint After Advice标准实现
Joinpoint After Advice AspectJ实现
Advice容器接口 - Advisor
Pointcut与Advice连接器 - PointcutAdvisor
Introduction与Advice连接器 - IntroductionAdvisor
Advisor的Interceptor适配器 - AdvisorAdapter
AdvisorAdapter实现
AOP代理接口 - AopProxy
AopProxy工厂接口与实现
JDK AopProxy实现 - JdkDynamicAopProxy
当前位置:
首页>>
技术小册>>
Spring AOP 编程思想(上)
小册名称:Spring AOP 编程思想(上)
### AspectJ基础:Aspect、Join Points、Pointcuts和Advice语法与特性 在Spring AOP(面向切面编程)的广阔领域中,AspectJ作为一种强大的语言和工具,为开发者提供了定义横切关注点(cross-cutting concerns)的能力,使得这些关注点能够独立于应用程序的业务逻辑之外进行管理。本章将深入探讨AspectJ的基本概念,包括Aspect(切面)、Join Points(连接点)、Pointcuts(切入点)和Advice(通知),以及它们的语法和特性,为理解和应用Spring AOP打下坚实基础。 #### 一、Aspect(切面) Aspect是AspectJ编程中的核心概念,它代表了横切关注点的模块化,即那些跨越多个类和方法边界,但又非业务逻辑本身的功能。Aspect能够定义切面的元数据和结构,包括它将要影响哪些方法(通过Pointcuts指定)、在这些方法执行的哪个阶段介入(通过Advice定义),以及具体的行为实现。 **语法示例**: 在AspectJ中,一个Aspect通过`aspect`关键字声明,并可以包含多个Pointcuts、Advice等元素。例如: ```java @Aspect public class LoggingAspect { // 声明切面 } ``` 使用注解`@Aspect`标记的类即为Aspect。在Spring框架中,这个类还需要被Spring容器管理,通常通过组件扫描或`@Bean`注解来实现。 #### 二、Join Points(连接点) Join Points是AspectJ中程序执行中的特定点,如方法的执行、异常的抛出等。它们是潜在的可被切面增强的点。需要注意的是,并非所有的Join Points都会被切面实际增强,只有那些被Pointcuts选中的Join Points才会被影响。 **特性**: - Join Points是AspectJ在程序执行时能够识别的潜在增强点。 - 它们涵盖了方法的执行(包括调用和执行)、构造函数的执行、字段的读写等。 - 由于数量庞大,通常不会直接引用Join Points,而是通过Pointcuts来间接指定。 #### 三、Pointcuts(切入点) Pointcuts是AspectJ中用于定义哪些Join Points将被Advice增强的表达式。它们是连接Aspect和程序执行点的桥梁,通过指定方法名、参数类型、返回类型等条件来匹配特定的Join Points。 **语法示例**: ```java @Pointcut("execution(* com.example.service.*.*(..))") public void serviceLayerExecution() {} ``` 在这个例子中,`@Pointcut`注解定义了一个名为`serviceLayerExecution`的切入点,它匹配`com.example.service`包下所有类的所有方法的执行。 **特性**: - Pointcuts使用AspectJ的表达式语言来定义,这种语言既强大又灵活。 - 可以组合多个Pointcuts以形成更复杂的匹配逻辑。 - Pointcuts定义了Advice应用的位置,是AspectJ编程中的关键元素。 #### 四、Advice(通知) Advice是AspectJ中在特定Join Points(由Pointcuts指定)上执行的代码块。它是切面功能的实际体现,可以在方法执行前、执行后、抛出异常时或方法返回时执行。 **类型**: - **Before Advice**:在方法执行前执行。 - **After Returning Advice**:在方法正常返回后执行。 - **After Throwing Advice**:在方法抛出异常时执行。 - **After (Finally) Advice**:无论方法是否成功执行,都会执行。 - **Around Advice**:包围了方法的执行,可以在方法执行前后添加自定义行为,甚至可以决定是否继续执行方法。 **语法示例**: ```java @Before("serviceLayerExecution()") public void logBeforeServiceMethod(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature().getName()); } @AfterReturning(pointcut = "serviceLayerExecution()", returning = "result") public void logAfterReturningServiceMethod(JoinPoint joinPoint, Object result) { System.out.println("After method: " + joinPoint.getSignature().getName() + " returned " + result); } ``` **特性**: - Advice定义了切面在Join Points上的具体行为。 - 可以访问当前Join Point的详细信息,如方法名、参数等。 - 通过与Pointcuts的结合,实现了对程序行为的精确控制。 #### 五、综合应用与最佳实践 在实际应用中,AspectJ的这些基本概念是紧密相关的。一个完整的Aspect通常会包含至少一个Pointcut和多个Advice,它们共同定义了切面的行为和作用范围。 **最佳实践**: - **保持切面的简单性**:尽量避免在单个切面中定义过多的复杂逻辑,以保持代码的可读性和可维护性。 - **清晰定义Pointcuts**:使用描述性强且易于理解的Pointcut表达式,以减少未来修改时的理解成本。 - **合理选择Advice类型**:根据需求选择合适的Advice类型,确保切面在正确的时间点介入。 - **利用AspectJ的强大功能**:充分利用AspectJ提供的组合Pointcuts、参数绑定等高级特性,以实现更复杂的横切关注点管理。 综上所述,AspectJ通过Aspect、Join Points、Pointcuts和Advice等核心概念,为Spring AOP提供了强大的编程模型和工具支持。理解和掌握这些概念及其语法特性,是深入应用Spring AOP的关键所在。
上一篇:
AspectJ代理代理:为什么Spring推荐AspectJ注解?
下一篇:
AspectJ注解驱动:注解能完全替代AspectJ语言吗?
该分类下的相关小册推荐:
Java语言基础13-类的加载和反射
Mybatis合辑3-Mybatis动态SQL
Java面试指南
Java必知必会-Maven初级
Java必知必会-Maven高级
Java语言基础14-枚举和注解
Java语言基础8-Java多线程
Java语言基础9-常用API和常见算法
Mybatis合辑4-Mybatis缓存机制
Java语言基础1-基础知识
Java语言基础7-Java中的异常
Mybatis合辑1-Mybatis基础入门