声明切面

启用 @AspectJ 支持后,Spring 会自动检测应用上下文中定义的所有类带有 @AspectJ 切面标记(即带有 `@Aspect` 注解)的 Bean,并用于配置 Spring AOP。接下来的两个示例展示了一个不太有用的切面所需的最低限度步骤。

第一个示例展示了应用上下文中的一个常规 Bean 定义,它指向一个带有 `@Aspect` 注解的 Bean 类。

  • Java

  • Kotlin

  • Xml

public class ApplicationConfiguration {

	@Bean
	public NotVeryUsefulAspect myAspect() {
		NotVeryUsefulAspect myAspect = new NotVeryUsefulAspect();
		// Configure properties of the aspect here
		return myAspect;
	}
}
class ApplicationConfiguration {

	@Bean
	fun myAspect() = NotVeryUsefulAspect().apply {
		// Configure properties of the aspect here
	}
}
<bean id="myAspect" class="org.springframework.docs.core.aop.ataspectj.aopataspectj.NotVeryUsefulAspect">
	<!-- configure properties of the aspect here -->
</bean>

第二个示例展示了 NotVeryUsefulAspect 类的定义,它带有 `@Aspect` 注解。

  • Java

  • Kotlin

@Aspect
public class NotVeryUsefulAspect {
}
@Aspect
class NotVeryUsefulAspect

切面(带有 `@Aspect` 注解的类)可以拥有方法和字段,就像其他任何类一样。它们也可以包含切点、通知和引入(inter-type)声明。

通过组件扫描自动检测切面
您可以将切面类注册为 Spring XML 配置中的常规 Bean,通过 `@Configuration` 类中的 `@Bean` 方法注册,或者让 Spring 通过类路径扫描自动检测它们 — 这与其他 Spring 管理的 Bean 相同。但是请注意,`@Aspect` 注解不足以在类路径中进行自动检测。为此,您需要添加一个单独的 `@Component` 注解(或者,根据 Spring 组件扫描器的规则,添加一个符合条件的自定义 stereotype 注解)。
用其他切面通知切面?
在 Spring AOP 中,切面本身不能成为其他切面通知的目标。类上的 `@Aspect` 注解将其标记为切面,因此将其排除在自动代理之外。