首页
技术小册
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 编程思想(上)
### 章节标题:XML配置驱动 - 创建AOP代理 在Spring框架中,面向切面编程(AOP, Aspect-Oriented Programming)是一种强大的编程范式,它允许开发者将横切关注点(如日志、事务管理、安全等)从业务逻辑中分离出来,从而提高代码的可维护性、可重用性和模块化。Spring AOP通过代理机制实现,其中XML配置是Spring早期版本中广泛使用的一种配置方式,尽管随着Spring Boot的普及,注解配置逐渐成为主流,但了解XML配置对于深入理解Spring AOP以及维护遗留系统依然具有重要意义。 #### 一、引言 在Spring AOP中,代理是AOP实现的关键机制。通过代理,Spring能够在方法调用前后、异常抛出时或方法返回后自动执行特定的逻辑。这种机制使得开发者无需修改业务代码即可增强其功能。XML配置提供了一种灵活且强大的方式来定义这些切面、通知(Advice)以及它们与目标对象的关联方式。 #### 二、AOP基本概念 在深入探讨XML配置驱动创建AOP代理之前,我们先简要回顾几个AOP的核心概念: - **切面(Aspect)**:一个横切关注点的模块化,如事务管理。它包含了通知和切入点定义。 - **通知(Advice)**:切面在特定连接点(Join Point)上执行的动作,如方法调用前后执行的代码。 - **连接点(Join Point)**:应用执行过程中能够插入切面的点,通常是方法的执行点。 - **切入点(Pointcut)**:用于定义通知应该应用到哪些连接点的表达式。 - **目标对象(Target Object)**:被增强的对象。 - **代理(Proxy)**:一个对象,用于控制对另一个对象的访问,并可能添加额外的行为。 #### 三、XML配置基础 在Spring的XML配置文件中,AOP的配置主要通过`<aop:config>`元素及其子元素来完成。这些子元素包括`<aop:aspect>`(定义切面)、`<aop:before>`、`<aop:after>`、`<aop:after-returning>`、`<aop:after-throwing>`、`<aop:around>`(定义不同类型的通知)以及`<aop:pointcut>`(定义切入点)。 #### 四、创建AOP代理的步骤 ##### 1. 引入必要的依赖 首先,确保你的项目中已经包含了Spring AOP相关的依赖。对于Maven项目,可以在`pom.xml`中添加类似以下的依赖: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>你的Spring版本</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>你的AspectJ版本</version> </dependency> ``` ##### 2. 定义切面类 切面类是一个普通的Java类,它包含了一个或多个通知方法。这些通知方法通过注解(尽管这里讨论的是XML配置,但了解注解方式有助于理解)或XML配置与特定的连接点相关联。 ```java public class LoggingAspect { public void beforeAdvice() { System.out.println("Before method execution"); } // 其他类型的通知方法... } ``` ##### 3. 配置XML 在Spring的XML配置文件中,你需要使用`<aop:config>`元素来定义AOP配置。首先,通过`<aop:aspect>`元素引入切面类,并通过其`ref`属性指定切面的bean id。然后,使用不同类型的通知元素(如`<aop:before>`)来定义具体的通知,并通过`pointcut`或`pointcut-ref`属性指定切入点表达式或引用之前定义的切入点。 ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 定义切面Bean --> <bean id="loggingAspect" class="com.example.LoggingAspect"/> <!-- AOP配置 --> <aop:config> <!-- 定义切面 --> <aop:aspect id="loggingAspectConfig" ref="loggingAspect"> <!-- 定义切入点 --> <aop:pointcut id="serviceMethod" expression="execution(* com.example.service.*.*(..))"/> <!-- 定义前置通知 --> <aop:before method="beforeAdvice" pointcut-ref="serviceMethod"/> <!-- 可以定义其他类型的通知... --> </aop:aspect> </aop:config> <!-- 其他Bean定义... --> </beans> ``` ##### 4. 运行和测试 配置完成后,当Spring容器启动时,它会根据XML配置自动创建代理对象,并将通知逻辑织入到目标对象中。你可以通过编写测试用例或启动应用来验证AOP配置是否按预期工作。 #### 五、高级话题 - **通知参数**:Spring AOP允许你在通知方法中访问连接点的详细信息,如方法参数、目标对象等。这可以通过在通知方法的签名中使用特定的参数(如`JoinPoint`)来实现。 - **引入(Introduction)**:除了增强方法之外,AOP还允许向目标对象动态地添加接口实现。这通过`<aop:declare-parents>`元素实现,但请注意,这在XML配置中相对复杂且使用较少。 - **性能考虑**:虽然AOP提供了强大的功能,但它也引入了额外的性能开销,尤其是在创建代理和调用链方面。因此,在性能敏感的应用中应谨慎使用AOP。 #### 六、结论 通过XML配置驱动创建AOP代理是Spring AOP的一种传统且强大的方式。尽管随着Spring Boot和注解的普及,XML配置的使用有所减少,但了解它对于理解Spring AOP的底层机制以及维护旧系统仍然至关重要。本章节详细介绍了如何通过XML配置来定义切面、通知和切入点,并展示了如何将这些元素组合起来以创建有效的AOP代理。希望这些内容能帮助你更深入地理解Spring AOP的XML配置方式。
上一篇:
编程方式创建 @AspectJ代理
下一篇:
标准代理工厂API - ProxyFactory
该分类下的相关小册推荐:
Mybatis合辑5-注解、扩展、SQL构建
Java语言基础13-类的加载和反射
SpringBoot合辑-高级篇
Java语言基础9-常用API和常见算法
JAVA 函数式编程入门与实践
Java必知必会-Maven初级
Java高并发秒杀入门与实战
Mybatis合辑3-Mybatis动态SQL
Mybatis合辑2-Mybatis映射文件
SpringBoot合辑-初级篇
Mybatis合辑1-Mybatis基础入门
Java性能调优实战