Declaring an Aspect

如果启用了 @AspectJ 支持,应用程序上下文中的任何 bean 都采用了带有 @Aspect 批注(带有 @Aspect 批注)的 @AspectJ 方面类的 bean,Spring 会自动检测到它们,并可用于配置 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>

这两个示例中,第二个示例显示带有 @Aspect 做批注的 NotVeryUsefulAspect 类定义:

  • Java

  • Kotlin

@Aspect
public class NotVeryUsefulAspect {
}
@Aspect
class NotVeryUsefulAspect

(带有 @Aspect 做批注的)方面(类)可以具有与任何其他类相同的方法和字段。它们还可以包含切入点、建议和引入(中间类型)声明。

Autodetecting aspects through component scanning

您可以在Spring XML配置中将aspect类注册为常规bean,通过`@Configuration`类中的`@Bean`方法注册,或者让Spring通过类路径扫描自动检测它们,就像其他Spring托管的bean一样。但是,请注意,@Aspect`注释不足以在类路径中进行自动检测。为此,您需要添加一个单独的@Component`注释(或者,一个自定义的stereotype注释,根据Spring组件扫描程序的规则进行限定)。

Advising aspects with other aspects?

在Spring AOP中,aspect本身不能成为其他aspect的advice目标。类上的`@Aspect`注释将其标记为aspect,因此,将其排除在自动代理之外。