首页
技术小册
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 编程思想(上)
### Spring AOP API整体设计 在深入探讨Spring AOP(面向切面编程)的编程思想之前,了解其API的整体设计是至关重要的一步。Spring AOP作为Spring框架中的一个核心模块,提供了一种强大的机制来分离应用程序中的关注点,使得横切关注点(如日志、事务管理等)能够独立于业务逻辑之外进行管理和重用。本章将详细阐述Spring AOP API的整体设计,包括其核心概念、主要组件、工作原理及API的构成。 #### 一、引言 面向切面编程(AOP)是一种编程范式,它允许开发者将横切关注点(cross-cutting concerns)模块化,这些关注点通常跨越应用程序的多个部分,如日志记录、事务管理、安全检查等。在Spring框架中,AOP通过代理模式(Proxy Pattern)实现,能够在不修改源代码的情况下,为对象添加额外的功能。 #### 二、Spring AOP核心概念 ##### 1. 切面(Aspect) 切面是Spring AOP中的一个核心概念,它代表了横切关注点的模块化。切面可以声明一个或多个通知(Advice),这些通知定义了何时以及如何应用增强(Advice)到连接点(Joinpoint)上。 ##### 2. 通知(Advice) 通知是切面中的具体行为,它在特定连接点执行时触发。Spring AOP支持五种类型的通知:前置通知(Before advice)、后置通知(After returning advice)、异常通知(After throwing advice)、最终通知(After advice, finally clause style)和环绕通知(Around advice)。 ##### 3. 连接点(Joinpoint) 连接点是程序执行过程中能够插入切面的点。在Spring AOP中,这些通常是方法的调用点。 ##### 4. 切点(Pointcut) 切点用于定义哪些连接点将被增强(即哪些方法调用将被通知)。切点表达式是声明哪些连接点将匹配特定通知的方式。 ##### 5. 引入(Introduction) 引入允许向现有类添加新方法或属性。这不同于继承,因为它是在运行时动态地向对象添加接口实现。 ##### 6. 目标对象(Target Object) 目标对象是被一个或多个切面增强的对象。 ##### 7. 代理(Proxy) 代理是Spring AOP实现的关键。当使用Spring AOP时,Spring框架会为目标对象创建一个代理。这个代理在调用目标对象的方法时,会执行相应的通知。 #### 三、Spring AOP API的主要组件 Spring AOP API主要由以下几个关键组件构成: ##### 1. `@Aspect` 注解 用于定义一个切面。在Spring AOP中,切面是一个普通的类,但使用`@Aspect`注解标记后,该类就可以包含通知和切点声明了。 ##### 2. 通知注解 Spring AOP提供了一系列注解来声明不同类型的通知,如`@Before`、`@AfterReturning`、`@AfterThrowing`、`@After`和`@Around`。这些注解可以标注在切面类中的方法上,以指定这些方法的执行时机。 ##### 3. 切点表达式 切点表达式定义了哪些连接点将被增强。Spring AOP使用AspectJ的切点表达式语言来定义切点。这些表达式可以基于方法名、参数类型、注解等多种条件来匹配连接点。 ##### 4. 代理工厂 Spring AOP通过代理工厂(如`ProxyFactoryBean`或基于`@EnableAspectJAutoProxy`注解的自动代理)为目标对象创建代理。这些代理在运行时拦截对目标对象的方法调用,并根据切点和通知的配置执行相应的逻辑。 #### 四、Spring AOP的工作原理 Spring AOP的工作原理主要基于代理机制。当Spring容器启动时,它会那些检查被`@Aspect`注解标记的类,并解析其中的通知和切点代理声明。然后,对于每个需要增强的目标对象,Spring会创建一个代理对象。这个对象会拦截对目标对象方法的调用,并根据切点表达式和通知的配置,在调用目标方法之前、之后或抛出异常时执行相应的逻辑。 #### 五、Spring AOP API的详细构成 ##### 1. `@Aspect` 注解及切面定义 ```java @Aspect public class LoggingAspect { // 通知和切点定义 } ``` ##### 2. 通知注解及其使用 ```java @Before("execution(* com.example.service.*.*(..))") public void logBeforeMethod(JoinPoint joinPoint) { // 前置通知逻辑 } @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result") public void logAfterReturning(JoinPoint joinPoint, Object result) { // 后置通知逻辑 } ``` ##### 3. 切点表达式 切点表达式使用AspectJ的切点表达式语言编写,可以指定方法名、参数类型、注解等多种条件。 ```java "execution(* com.example.service.*.*(..))" // 匹配com.example.service包下所有类的所有方法 "execution(* com.example.service..*.*(..))" // 匹配com.example.service包及其子包下所有类的所有方法 "@annotation(com.example.Secure)" // 匹配所有带有@Secure注解的方法 ``` ##### 4. 代理配置 在Spring配置文件中或通过`@EnableAspectJAutoProxy`注解启用自动代理。 ```java @Configuration @EnableAspectJAutoProxy public class AppConfig { // 配置类内容 } ``` 或者,在XML配置文件中: ```xml <aop:aspectj-autoproxy/> ``` #### 六、总结 Spring AOP API的整体设计体现了面向切面编程的核心理念,即通过代理机制将横切关注点模块化,使得这些关注点能够独立于业务逻辑之外进行管理和重用。Spring AOP API提供了丰富的注解和切点表达式语言,使得开发者能够灵活地定义切面和通知,从而实现对目标对象方法的拦截和增强。通过掌握Spring AOP API的整体设计,开发者可以更加高效地利用AOP技术来优化代码结构,提高应用程序的可维护性和可扩展性。
上一篇:
替换TargetSource
下一篇:
接入点接口 - Joinpoint
该分类下的相关小册推荐:
Java语言基础13-类的加载和反射
java源码学习笔记
Mybatis合辑1-Mybatis基础入门
Java语言基础3-流程控制
Java语言基础5-面向对象初级
Java语言基础15-单元测试和日志技术
SpringBoot零基础到实战
Java语言基础11-Java中的泛型
Java性能调优实战
SpringBoot合辑-高级篇
Java必知必会-Maven高级
SpringBoot合辑-初级篇