启用 @AspectJ
支持后,任何在你的应用上下文中定义的 bean,这个类就是 @AspectJ
切面(有 @Aspect
注解),会被 Spring 自动检测到并用于配置 Spring AOP。接下来的两个例子显示了一个不怎么有用的切面所需的最小定义。
两个例子中的第一个显示了应用程序上下文中的一个普通 Bean 定义,它指向一个具有@Aspect
注解的 Bean 类:
<bean id="myAspect" class="org.xyz.NotVeryUsefulAspect">
<!-- configure properties of the aspect here -->
</bean>
两个例子中的第二个展示了 NotVeryUsefulAspect 类的定义,它被 org.aspectj.lang.annotation.Aspect
注解了。
package org.xyz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class NotVeryUsefulAspect {
}
Aspects(用 @Aspect 注解的类)可以有方法和字段,和其他类一样。它们也可以包含 pointcut、advice 和 引入(inter-type)声明。
:::info 通过组件扫描自动检测 aspect
你可以通过 @Configuration 类中的 @Bean 方法,将 aspect 类注册为 Spring XML 配置中的普通 Bean,或者让 Spring 通过 classpath 扫描自动检测它们 — 与任何其他 Spring 管理的 Bean 一样。然而,请注意,@Aspect 注解并不足以在 classpath 中进行自动检测。为此,你需要添加一个单独的 @Component
注解(或者,根据 Spring 组件扫描器的规则,添加一个符合条件的自定义元注解)。
:::
:::info 用切面为其他切面提供增强?
在 Spring AOP 中,aspect 本身不能成为其他切面的增强的目标。类上的 @Aspect 注解标志着它是一个切面,因此,它被排除在自动代理之外。 :::