首页
技术小册
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配置Before Advice 在Spring AOP(面向切面编程)的广阔领域中,`Before Advice`(前置通知)是一种非常基础且常用的切面增强类型,它允许我们在目标方法执行之前插入自定义的逻辑。这种机制极大地提高了代码的重用性和模块化,使得横切关注点(如日志记录、事务管理、安全检查等)可以独立于业务逻辑之外进行管理。在Spring框架中,通过XML配置文件来实现`Before Advice`的配置是一种经典且直观的方式,本章节将深入探讨如何在Spring AOP中使用XML来配置`Before Advice`。 #### 一、Spring AOP基础回顾 在深入讨论XML配置`Before Advice`之前,先简要回顾一下Spring AOP的基础知识。Spring AOP是Spring框架的一个子项目,它提供了面向切面的编程能力,允许开发者将横切关注点(cross-cutting concerns)模块化,并通过声明式的方式应用到业务逻辑中。Spring AOP主要通过代理模式(Proxy Pattern)实现,可以在运行时或编译时为目标对象创建代理,并在代理中织入(weave)增强逻辑。 #### 二、Before Advice简介 `Before Advice`是Spring AOP中五种通知(Advice)类型之一,它在目标方法执行之前运行。这种通知通常用于执行前置检查、准备资源或记录日志等操作。与其他类型的通知(如After Returning Advice、Throws Advice、Around Advice等)相比,`Before Advice`不会改变目标方法的返回值,也不会抛出异常来中断目标方法的执行。 #### 三、XML配置Before Advice的步骤 要在Spring中通过XML配置`Before Advice`,你需要遵循以下步骤: ##### 1. 定义通知类 首先,你需要创建一个实现了`org.aopalliance.intercept.MethodBeforeAdvice`接口或继承自`org.springframework.aop.MethodBeforeAdvice`的类。这个类将包含要在目标方法执行之前执行的代码。 ```java import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; public class MyBeforeAdvice implements MethodBeforeAdvice { @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("Before executing " + method.getName()); // 在这里编写前置逻辑 } } ``` ##### 2. 配置Spring的XML文件 接下来,在Spring的XML配置文件中,你需要定义目标对象、通知对象以及一个或多个切面(Aspect),切面将目标对象和通知对象关联起来,并指定通知在何时执行。 ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 定义目标对象 --> <bean id="myTarget" class="com.example.MyTargetClass"/> <!-- 定义通知对象 --> <bean id="myBeforeAdvice" class="com.example.MyBeforeAdvice"/> <!-- 定义切面 --> <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> <!-- 使用advisor来关联通知和目标 --> <bean id="myAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <property name="advice" ref="myBeforeAdvice"/> <property name="mappedNames" value="myTargetMethod"/> <!-- 指定方法名匹配 --> </bean> <!-- 或者使用正则表达式来匹配方法 --> <!-- <bean id="myRegexAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice" ref="myBeforeAdvice"/> <property name="patterns"> <list> <value>.*TargetMethod.*</value> </list> </property> </bean> --> </beans> ``` **注意**:上述XML配置示例中,`NameMatchMethodPointcutAdvisor`和`RegexpMethodPointcutAdvisor`用于指定哪些方法会被`Before Advice`拦截。但在Spring AOP中,更常用的是基于AspectJ的表达式来定义切点(Pointcut),这种方式更加灵活和强大。不过,为了保持本章节聚焦于XML配置,我们暂时不深入讨论AspectJ表达式。 ##### 3. 使用AspectJ表达式定义切点(可选) 虽然上述示例未直接使用AspectJ表达式,但了解如何在XML中使用AspectJ表达式定义切点对于掌握Spring AOP至关重要。在Spring 2.0及更高版本中,可以通过`<aop:config>`元素和AspectJ的切点表达式来定义切面。 ```xml <aop:config> <!-- 定义切面 --> <aop:aspect id="myAspect" ref="myBeforeAdvice"> <!-- 定义切点 --> <aop:pointcut id="myPointcut" expression="execution(* com.example.*.*(..))"/> <!-- 将切点与通知关联 --> <aop:before method="before" pointcut-ref="myPointcut"/> </aop:aspect> </aop:config> <!-- 注意:此时myBeforeAdvice类需要稍作修改,以匹配AspectJ的Advice接口 --> ``` 注意,当使用AspectJ表达式时,`MyBeforeAdvice`类可能需要实现`org.aspectj.lang.annotation.Before`注解的替代接口(尽管在这个特定场景下,直接使用`MethodBeforeAdvice`接口通过XML配置仍然有效),或者更常见的,是通过AspectJ的注解方式直接在类中定义切面和通知。 #### 四、注意事项 - **性能考虑**:虽然AOP提供了强大的横切关注点管理能力,但它也引入了额外的性能开销,因为每次调用被增强的方法时,都需要通过代理进行。因此,在性能敏感的应用中,需要谨慎使用AOP。 - **切点表达式**:掌握AspectJ的切点表达式是高效使用Spring AOP的关键。切点表达式允许你精确地指定哪些方法将被拦截,从而避免不必要的性能损耗。 - **兼容性**:随着Spring框架的不断发展,不同版本的Spring AOP在配置和API上可能存在差异。因此,在查阅文档和示例时,请确保它们与你的Spring版本兼容。 #### 五、总结 通过XML配置`Before Advice`是Spring AOP中实现前置通知的一种经典方式。它允许开发者在不修改业务代码的情况下,为目标方法添加前置逻辑。虽然随着Spring的发展,注解配置和AspectJ的集成变得更加流行,但了解XML配置方式对于深入理解Spring AOP的底层原理和兼容性处理仍然具有重要意义。本章节详细介绍了如何定义通知类、在XML中配置目标对象、通知对象和切面,并简要讨论了AspectJ切点表达式的应用。希望这些内容能够帮助你更好地掌握Spring AOP中的`Before Advice`配置。
上一篇:
@AspectJ前置动作:@Before与@Around谁优先级执行?
下一篇:
API实现Before Advice
该分类下的相关小册推荐:
Java语言基础11-Java中的泛型
Java高并发秒杀入门与实战
java源码学习笔记
深入理解Java虚拟机
SpringBoot合辑-初级篇
Mybatis合辑1-Mybatis基础入门
Java语言基础5-面向对象初级
Java语言基础9-常用API和常见算法
Java语言基础13-类的加载和反射
Java语言基础12-网络编程
Java并发编程实战
深入拆解 Java 虚拟机