Spring AOP实现原理分析

简介: Spring的核心是IOC与AOP,IOC主要是依赖关系的管理,依赖查询,依赖注入,在之前bean的生命周期文章中已经对bean的生命周期做了相对多的分析,这里以前探讨下AOP的实现原理。

Spring的核心是IOC与AOP,IOC主要是依赖关系的管理,依赖查询,依赖注入,在之前bean的生命周期文章中已经对bean的生命周期做了相对多的分析,这里以前探讨下AOP的实现原理。

关键类

  • AspectJAwareAdvisorAutoProxyCreator Spring启动时的beanPostProcessor,bean生命周期中经常可以看到beanPostProcessor在起作用,AOP也是基于IOC来实现的。
  • DefaultAopProxyFactory.createAopProxy(AdvisedSupport config) 创建AOP代理类,这样才可以实现AOP
  • AopNamespaceHandler aop标签解析的handler
  • ConfigBeanDefinitionParser ,aop config标签的解析类。

分析

  1. 首先搭建一个能运行 Spring AOP的demo,参考早期的一篇文章Spring AOP入门

预览一下配置文件


img_d58f116cb6e4f9e621c133bc6c82d035.png
image.png
  1. 运行方式不变,在Bean生命周期-实例化ApplicationContext中的运行方式。
// Spring加载配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("app.xml");
  1. spring在启动的时候加载配置文件的方式不变,变化的只是其解析配置文件的方式,而实例化ApplicationContext中加载配置文件过程

refresh
-> obtainFreshBeanFactory
-> refreshBeanFactory
-> AbstractRefreshableApplicationContext.loadBeanDefinitions(beanFactory)
-> ...
-> XmlBeanDefinitionReader.loadBeanDefinitions(Resource resource)
-> DefaultBeanDefinitionDocumentReader.parseBeanDefinitions

以上过程在bean生命周期中都有提到过,以上没有变化。

区别在于<aop:config>是自定义的标签,这次走的是parseCustomElement方法

img_217c4418641b2670a58b17e69a177f2f.png
image.png

  1. 找到自定义元素的NamespaceHandler,NamespaceHandler的映射关系定义在 META/spring.handlers文件中。Spring各个jar包中的spring.handlers都会生效。

NameSpaceHandler的映射关系存储在DefaultNamespaceHandlerResolver中,自定义的aop:config标签找到的Handler是AopNamespaceHandler

img_b19e47a52c9013ef9f0f1125ecd882d6.png
image.png
  1. AopNamespaceHandler是在namespaceHandlerResolver进行resolve的时候,实例化并且调用init方法的,然后AopNamespaceHandler进行parse。
img_665880466a23b6d092588c71c27cd045.png
image.png

AopNamespaceHandler在parse的时候,找到标签对应的Parser再进行parse,因此[aop:config]标签又交给了ConfigBeanDefinitionParser来解析。

  // AopNamespaceHandler调用的parse方法
    public BeanDefinition parse(Element element, ParserContext parserContext) {
        return findParserForElement(element, parserContext).parse(element, parserContext);
    }
  1. ConfigBeanDefinitionParser的解析过程,其刚开始配置configureAutoProxyCreator,会配置AspectJAwareAdvisorAutoProxyCreator这个类做为spring的bean。

ConfigBeanDefinitionParser.parse
-> configureAutoProxyCreator
-> AopNamespaceUtils.registerAspectJAutoProxyCreatorIfNecessary(parserContext, element)
-> ...

img_8d1df717d5e568919c811333505cbbae.png
image.png
  1. 在解析其它标签的时候,大致都是注册一个bean,pointcut,advisor,aspect内部解析就不相信说明了,这次我们只是概览。
img_955e4b1a0ae868aedc5558eeaaba396c.png
image.png
  1. 解析完aop的元素之后,其它的过程仍然和bean生命周期相同,不同之处则在于如果配置了AOP相关标签,在处理bean的时候,beanPostProcessor在bean生命周期内多处有影响,足以改变bean的结构。

AOP的实现方式基于IOC,通过beanPostProcessor来自定义bean的结构

img_0b6de556f9cb59e8948f81ecc562b321.png
image.png
  1. 在bean实例化完成之后,会调用beanPostProcessor的postProcessAfterInitialization方法,这个生命阶段,我们在Bean生命周期汇总这篇文章里也提到过。

AspectJAwareAdvisorAutoProxyCreator的postProcessAfterInitialization方法再其父类AbstractAutoProxyCreator中实现,其会对已经实例化的bean进行wrap。

而对bean进行wrap的时候,就是使用ProxyFactory createAopProxy,最终会走到DefaultAopProxyFactory的createAopProxy方法。

可以看到:

  • 如果bean的类是接口或者类是JDK内部的代理类,其使用 JDK的动态代理类
  • 其它情况是CGLIB来实现
img_799d2d5ebafced826567cbbfefde9455.png
image.png
  1. 最后生成的HelloWorld长这个样子。其已经是生成的代理类了,AOP功能已经生效。
img_d7729d877d37593e40a3908c43863fe6.png
image.png
  1. 创建代理类之后,其余的过程与bean的生命周期基本一致

总结

aop的功能也是借助spring对bean的管理来实现的,弄明白了bean的整个过程,spring的其它模块理解起来都会很轻松。

相关文章
|
10月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
864 0
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
1689 13
|
9月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
11月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
11月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
1436 0
|
负载均衡 Java API
基于 Spring Cloud 的微服务架构分析
Spring Cloud 是一个基于 Spring Boot 的微服务框架,提供全套分布式系统解决方案。它整合了 Netflix、Zookeeper 等成熟技术,通过简化配置和开发流程,支持服务发现(Eureka)、负载均衡(Ribbon)、断路器(Hystrix)、API网关(Zuul)、配置管理(Config)等功能。此外,Spring Cloud 还兼容 Nacos、Consul、Etcd 等注册中心,满足不同场景需求。其核心组件如 Feign 和 Stream,进一步增强了服务调用与消息处理能力,为开发者提供了一站式微服务开发工具包。
1034 0
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
1245 25
|
SQL 前端开发 Java
深入分析 Spring Boot 项目开发中的常见问题与解决方案
本文深入分析了Spring Boot项目开发中的常见问题与解决方案,涵盖视图路径冲突(Circular View Path)、ECharts图表数据异常及SQL唯一约束冲突等典型场景。通过实际案例剖析问题成因,并提供具体解决方法,如优化视图解析器配置、改进数据查询逻辑以及合理使用外键约束。同时复习了Spring MVC视图解析原理与数据库完整性知识,强调细节处理和数据验证的重要性,为开发者提供实用参考。
592 0
|
Java API 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
1830 0