@Aspect 注解是如何被解析和处理的

news/2025/2/27 9:05:31

@Aspect 注解是 Spring AOP (Aspect-Oriented Programming) 的核心注解之一,用于声明一个切面类。Spring 容器在启动时会解析和处理 @Aspect 注解,并将其转换为相应的代理对象,以实现 AOP 功能。

解析和处理流程:

  1. 容器启动: Spring 容器启动时,会扫描并加载 Bean 定义。

  2. 发现 @Aspect 注解:

    • 如果在 XML 配置中启用了 <aop:aspectj-autoproxy/>,或者在 Java 配置类上使用了 @EnableAspectJAutoProxy 注解,Spring 容器会启用 AspectJ 自动代理。
    • 启用自动代理后,容器会创建一个名为 AnnotationAwareAspectJAutoProxyCreatorBeanPostProcessor
    • AnnotationAwareAspectJAutoProxyCreator 会在 Bean 初始化阶段检查 Bean 是否带有 @Aspect 注解。
  3. 解析 @Aspect 注解:

    • 如果发现 Bean 带有 @Aspect 注解,AnnotationAwareAspectJAutoProxyCreator 会解析该注解及其内部的切点 (Pointcut)、通知 (Advice) 等信息。
    • 切点 (Pointcut): 使用 @Pointcut 注解定义,指定了哪些连接点 (Join Point) 会被拦截。连接点通常是方法的执行。
    • 通知 (Advice): 使用 @Before@After@AfterReturning@AfterThrowing@Around 等注解定义,指定了在切点匹配的连接点上执行的操作。
      • @Before: 在连接点之前执行。
      • @After: 在连接点之后执行(无论是否发生异常)。
      • @AfterReturning: 在连接点成功返回后执行。
      • @AfterThrowing: 在连接点抛出异常后执行。
      • @Around: 环绕通知,在连接点前后都可以执行,还可以控制目标方法的执行。
    • AnnotationAwareAspectJAutoProxyCreator 会将解析出的切点和通知信息封装成 Advisor 对象。Advisor 代表一个切面,包含了切点和通知。
  4. 创建代理对象:

    • 对于需要被 AOP 增强的 Bean(即目标对象,Target Object),AnnotationAwareAspectJAutoProxyCreator 会为其创建代理对象。
    • Spring AOP 使用两种代理方式:
      • JDK 动态代理: 如果目标对象实现了接口,Spring 会使用 JDK 动态代理。代理对象实现了与目标对象相同的接口。
      • CGLIB 代理: 如果目标对象没有实现接口,Spring 会使用 CGLIB 代理。代理对象是目标对象的子类。
    • 代理对象拦截了对目标对象方法的调用,并根据 Advisor 中的切点和通知信息,在方法执行前后执行相应的操作。
  5. 将代理对象放入容器:

    • AnnotationAwareAspectJAutoProxyCreator 会将创建的代理对象放入 Spring 容器中,替换掉原来的目标对象。
    • 当其他 Bean 依赖于目标对象时,Spring 容器会注入代理对象,而不是原始的目标对象。

详细说明:

  • AnnotationAwareAspectJAutoProxyCreator 这是 Spring AOP 的核心组件,它实现了 BeanPostProcessor 接口,负责解析 @Aspect 注解、创建代理对象等。
  • Advisor 代表一个切面,包含了切点和通知。
  • Pointcut 切点,定义了哪些连接点会被拦截。使用 AspectJ 的切点表达式语言 (Pointcut Expression Language) 来描述。
  • Advice 通知,定义了在切点匹配的连接点上执行的操作。
  • Join Point 连接点,程序执行过程中的一个点,例如方法的执行、异常的抛出等。
  • Target Object 目标对象,需要被 AOP 增强的 Bean。
  • Proxy Object 代理对象,Spring AOP 创建的代理对象,拦截了对目标对象方法的调用。

示例:

java">import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    // 定义切点:拦截所有 com.example.service 包下的所有类的所有方法
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceMethods() {}

    // 前置通知:在方法执行前记录日志
    @Before("serviceMethods()")
    public void beforeAdvice() {
        System.out.println("Before method execution...");
    }

    // 后置通知:在方法执行后记录日志
    @After("serviceMethods()")
    public void afterAdvice() {
        System.out.println("After method execution...");
    }
}

在这个例子中:

  • @Aspect 注解声明了 LoggingAspect 类是一个切面。
  • @Pointcut 注解定义了一个名为 serviceMethods 的切点,它匹配 com.example.service 包下所有类的所有方法。
  • @Before@After 注解定义了两个通知,分别在方法执行前后记录日志。

当 Spring 容器启动时,会解析 @Aspect 注解,并为 com.example.service 包下的所有 Bean 创建代理对象。当这些 Bean 的方法被调用时,代理对象会拦截方法调用,并在方法执行前后执行 beforeAdviceafterAdvice 方法。

总结流程图:

+---------------------+     +--------------------------------+     +---------------------+
|     Spring 容器     |---->| AnnotationAwareAspectJAutoProxyCreator |---->|      目标对象       |
+---------------------+     +--------------------------------+     +---------------------+
                                    |                                        |
                                    | 1. 发现 @Aspect 注解                |
                                    | 2. 解析 @Aspect、@Pointcut、@Advice |
                                    | 3. 创建 Advisor 对象                  |
                                    |                                        |
                                    |----------------------------------------|
                                    |                                        |
                                    | 4. 创建代理对象 (JDK 或 CGLIB)           |
                                    |                                        |
                                    V                                        V
                              +----------------+                      +-----------------+
                              |    代理对象     |                      |   调用目标方法    |
                              +----------------+                      +-----------------+
                                    |                                        |
       +---------------------------+---------------------------+            |
       |                           |                           |            |
       |   @Before (执行前)       |     目标方法执行        |   @After (执行后)     |
       |                           |                           |            |
       +---------------------------+---------------------------+            |
                                                                            |
                                         <-----------------------------------+


http://www.niftyadmin.cn/n/5869844.html

相关文章

MySQL DBA技能指南

1. MySQL 安装与配置 安装和部署&#xff1a;掌握 MySQL 在不同操作系统上的安装方法&#xff08;Linux、Windows、Docker 等&#xff09;。配置管理&#xff1a;熟悉 MySQL 配置文件&#xff08;my.cnf 或 my.ini&#xff09;的设置与优化&#xff0c;了解常见的配置参数&…

(十 一)趣学设计模式 之 组合模式!

目录 一、 啥是组合模式&#xff1f;二、 为什么要用组合模式&#xff1f;三、 组合模式的实现方式四、 组合模式的优缺点五、 组合模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支…

道可云人工智能每日资讯|深圳将设立人工智能和机器人产业基金

道可云元宇宙每日简报&#xff08;2025年2月26日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 上海青浦发布国际产业协作元宇宙平台 近日&#xff0c;“2025出海企业与跨境专业服务论坛”在上海青浦区徐泾镇举行。论坛上重磅发布三大全球化服务平台&#xff0c…

免费使用SCI润色神器QuillBot

QuillBot是写SCI论文的英语语法检查、润色等常用网站&#xff0c;但是普通用户会有润色级别与字数等限制。本文用于帮助大家免费使用QuillBot。 1.下载破解插件 https://download.csdn.net/download/bynacqt/90434653 2.将下载好的压缩包文件放置一个文件夹下&#xff0c;然后…

OA办公系统自动渗透测试过程

目录 一、下载环境源码 二、部署环境 三、测试 XSS漏洞 SQL注入 文件上传漏洞 一、下载环境源码 OA源码打包地址: https://download.csdn.net/download/weixin_43650289/90434502?spm=1001.2014.3001.5503 二、部署环境

NLP09-加强1-对比SVM

支持向量机&#xff08;SVM&#xff09; &#xff08;一&#xff09;导入 SVM 相关库 &#xff08;二&#xff09; 修改模型初始化 &#xff08;三&#xff09; 比较 朴素贝叶斯分类器 SVM分类器 支持向量机&#xff08;SVM&#xff09; 代码修改基于NLP09-朴素贝叶斯问句…

CSS3 圆角:实现与优化指南

CSS3 圆角&#xff1a;实现与优化指南 随着网页设计的发展&#xff0c;CSS3 圆角已经成为了现代网页设计中不可或缺的元素之一。本文将详细讲解 CSS3 圆角的基本用法、实现方式以及优化技巧&#xff0c;帮助您在网页设计中更好地运用这一功能。 一、CSS3 圆角基本用法 1.1 基…

【论文笔记-ICCV 2023】ControlNet:为文本到图像扩散模型添加条件控制

ControlNet&#xff1a;为文本到图像扩散模型添加条件控制 ControlNet 是一种神经网络架构&#xff0c;可以通过空间定位、特定于任务的图像条件来增强大型预训练文本到图像扩散模型。 ControlNet 将其他条件注入神经网络的块中&#xff0c;如下图。 神经块将特征图 x 作为输…