对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

声明一个切面

启用 @AspectJ 支持后,应用程序上下文中任何类带有 @AspectJ 切面(即使用了 @Aspect 注解)的 bean 都会被 Spring 自动检测,并用于配置 Spring AOP。接下来的两个示例展示了实现一个不太有用的切面所需的最少步骤。spring-doc.cadn.net.cn

前两个示例中的第一个展示了一个在应用上下文中指向带有 @Aspect 注解的 bean 类的常规 bean 定义:spring-doc.cadn.net.cn

<bean id="myAspect" class="com.xyz.NotVeryUsefulAspect">
	<!-- configure properties of the aspect here -->
</bean>

两个示例中的第二个展示了 NotVeryUsefulAspect 类的定义,该类使用了 @Aspect 注解:spring-doc.cadn.net.cn

package com.xyz;

import org.aspectj.lang.annotation.Aspect;

@Aspect
public class NotVeryUsefulAspect {
}
package com.xyz

import org.aspectj.lang.annotation.Aspect

@Aspect
class NotVeryUsefulAspect

切面(使用 @Aspect 注解的类)可以拥有方法和字段,与任何其他类相同。它们还可以包含切入点(pointcut)、通知(advice)和引入(introduction,也称为类型间)声明。spring-doc.cadn.net.cn

通过组件扫描自动检测切面
您可以在 Spring XML 配置中将切面类注册为普通 Bean, 也可以在 @Bean 类中通过 @Configuration 方法进行注册, 或者让 Spring 通过类路径扫描自动检测它们——与其他任何 Spring 管理的 Bean 相同。 然而,请注意,仅使用 @Aspect 注解并不足以在类路径中实现自动检测。 为此,您需要额外添加一个 @Component 注解(或者,也可以使用符合 Spring 组件扫描器规则的自定义构造型注解)。
使用其他切面来通知(advising)切面?
在 Spring AOP 中,切面本身不能成为其他切面的通知目标。类上的 @Aspect 注解将其标记为一个切面,因此会将其排除在自动代理(auto-proxying)之外。