在 Spring 中,虽然我们可以使用 XML 配置文件可以实现 AOP 开发,但如果所有的配置都集中在 XML 配置文件中,就势必会造成 XML 配置文件过于臃肿,从而给维护和升级带来一定困难。
为此,AspectJ 框架为 AOP 开发提供了一套 @AspectJ 注解。它允许我们直接在 Java 类中通过注解的方式对切面(Aspect)、切入点(Pointcut)和增强(Advice)进行定义,Spring 框架可以根据这些注解生成 AOP 代理。
关于注解的介绍如表 1 所示。
启用 @AspectJ 注解支持
在使用 @AspectJ 注解进行 AOP 开发前,首先我们要先启用 @AspectJ 注解支持。
我们可以通过以下 2 种方式来启用 @AspectJ 注解。
1)使用 Java 配置类启用
我们可以在 Java 配置类(标注了 @Configuration 注解的类)中,使用 @EnableAspectJAutoProxy 和 @ComponentScan 注解启用 @AspectJ 注解支持。
1. @Configuration
2. @ComponentScan(basePackages = "net.biancheng.c") //注解扫描
3. @EnableAspectJAutoProxy //开启 AspectJ 的自动代理
4. public class AppConfig {
5. }
2)基于 XML 配置启用
在 Spring 的 XML 配置文件中,添加以下内容启用 @AspectJ 注解支持。
1. 2. 3. 4.
定义切面 @Aspect
我们可以通过 @Aspect 注解将一个 Bean 定义为切面。
在启用了 @AspectJ 注解支持的情况下,Spring 会自动将 IoC 容器(ApplicationContext)中的所有使用了 @Aspect 注解的 Bean 识别为一个切面。
我们可以在 XML 配置中通过一些配置将这个类定义为一个 Bean,如下。
1. 2. ... 3.
在定义完 Bean 后,我们只需要在Bean 对应的 Java 类中使用一个 @Aspect 注解,将这个 Bean 定义为一个切面,代码如下。
1. package net.biancheng.c;
3. import org.aspectj.lang.annotation.*;
5. @Aspect //定义为切面
6. public class MyAspect {
8. }
全注解方式定义切面
我们也可以在 Java 类上使用以下 2 个注解