Spring AOP AspectJ 注解示例

17 Mar 2025 | 6 分钟阅读

Spring Framework 建议您使用 Spring AspectJ AOP 实现,而不是 Spring 1.2 旧式的基于 dtd 的 AOP 实现,因为它为您提供了更多控制,并且易于使用。

有两种方法可以使用 Spring AOP AspectJ 实现

  1. 通过注解:我们将在本文中学习它。
  2. 通过 xml 配置(基于 schema):我们将在下一页学习它。

要理解 aop 概念、其优势等,请访问此处 AOP 概念教程



Spring AspectJ AOP 实现提供了许多注解

  1. @Aspect 声明该类为切面。
  2. @Pointcut 声明切点表达式。

用于创建通知的注解如下所示

  1. @Before 声明前置通知。它在调用实际方法之前应用。
  2. @After 声明后置通知。它在调用实际方法之后且返回结果之前应用。
  3. @AfterReturning 声明返回后通知。它在调用实际方法之后且返回结果之前应用。但您可以在通知中获取结果值。
  4. @Around 声明环绕通知。它在调用实际方法之前和之后应用。
  5. @AfterThrowing 声明抛出通知。如果实际方法抛出异常,则应用它。

理解切点

切点是 Spring AOP 的一种表达式语言。

@Pointcut 注解用于定义切点。我们也可以按名称引用切点表达式。让我们看看切点表达式的简单示例。

切点表达式的名称是 doSomething()。它将应用于 Operation 类中的所有方法,而与返回类型无关。

理解切点表达式

让我们尝试通过下面给出的示例来理解切点表达式

它将应用于所有公共方法。


它将应用于 Operation 类的所有公共方法。


它将应用于 Operation 类的所有方法。


它将应用于 Employee 类的所有公共 setter 方法。


它将应用于返回 int 值的 Operation 类的所有方法。


1) @Before 示例

AspectJ Before 通知在实际的业务逻辑方法之前应用。您可以在此处执行任何操作,例如转换、身份验证等。

创建一个包含实际业务逻辑的类。

文件:Operation.java

现在,创建包含前置通知的切面类。

文件:TrackOperation.java

现在,创建定义 bean 的 applicationContext.xml 文件。

文件:applicationContext.xml

现在,让我们调用实际的方法。

文件:Test.java

输出

如您所见,在调用 msg()、m() 和 k() 方法之前打印了附加关注点。

现在,如果您更改切点表达式,如下所示

现在,附加关注点将应用于 Operation 类中以 m 开头的方法。 输出将如下所示

现在,您可以看到在调用 k() 方法之前没有打印附加关注点。


2) @After 示例

AspectJ 后置通知在调用实际业务逻辑方法之后应用。它可以用于维护日志、安全性、通知等。

此处,我们假设 Operation.javaapplicationContext.xmlTest.java 文件与 @Before 示例中给出的一样。

创建包含后置通知的切面类。

文件:TrackOperation.java

输出

您可以看到,在调用 msg()、m() 和 k() 方法之后打印了附加关注点。


3) @AfterReturning 示例

通过使用返回后通知,我们可以在通知中获取结果。

创建包含业务逻辑的类。

文件:Operation.java

创建包含返回后通知的切面类。

文件:TrackOperation.java
文件:applicationContext.xml

它与 @Before 通知示例中给出的一样

文件:Test.java

现在,创建调用实际方法的 Test 类。

输出

您可以看到返回值打印了两次,一次由 TrackOperation 类打印,另一次由 Test 类打印。


4) @Around 示例

AspectJ 环绕通知在调用实际业务逻辑方法之前和之后应用。

此处,我们假设 applicationContext.xml 文件与 @Before 示例中给出的一样。

创建一个包含实际业务逻辑的类。

文件:Operation.java

创建包含环绕通知的切面类。

您需要在通知方法中传递 PreceedingJoinPoint 引用,以便我们可以通过调用 proceed() 方法来继续该请求。

文件:TrackOperation.java
文件:Test.java

现在,创建调用实际方法的 Test 类。

输出

您可以看到,在调用 msg() 和 display 方法之前和之后打印了附加关注点。


5) @AfterThrowing 示例

通过使用抛出后通知,我们可以在 TrackOperation 类中打印异常。让我们看看 AspectJ AfterThrowing 通知的示例。

创建包含业务逻辑的类。

文件:Operation.java

创建包含抛出后通知的切面类。

此处,我们还需要传递 Throwable 引用,以便我们可以在此处拦截异常。

文件:TrackOperation.java
文件:applicationContext.xml

它与 @Before 通知示例中给出的一样

文件:Test.java

现在,创建调用实际方法的 Test 类。

输出