`

Spring源码学习(二)------ AOP .

 
阅读更多

http://blog.csdn.net/cutesource/article/details/6136275

 

AOP有些特有的概念,如:advisor、advice和pointcut等等,使用或配置起来有点绕,让人感觉有些距离感,其实它的实现就是一组标准的设计模式的组合使用:Factory、Proxy、Chain of Responsibility,只要搞清楚这几个设计模式,读AOP的源码是比较容易的。

首先看看ProxyFactoryBean这个类,这是AOP使用的入口,从AOP拿到的bean object就是ProxyFactoryBean.getObject得到的,从这条线下去,发现AOP就是通过Proxy模式从实际要执行的target做了包装,而Proxy还不止一套方案,通过Factory封装了两套Proxy实现方案:JDK 动态Proxy和Cglib Proxy。有两套实现主要是因为JDK 动态Proxy必须要target实现某个接口,如果不满足这个条件就会用Cglib增强字节码的方式来实现proxy。

就拿JDK Proxy为例,Spring AOP使用了标准的JDK提供的动态Proxy方案,我们先看看标准的动态Proxy是什么样子,看下面类图:

Cilent通过Proxy.newProxyInstance(classLoader, proxiedInterfaces, invocationHandler);就能拿到target的proxy object,在执行target的方法时就会先执行到DynamicProxy中的invoke方法从而实现代理包装。基于这个道理来看Spring AOP的实现,实际上就是标准地基于这个方式来做的,Spring AOP的所有花招都体现在JdkDynamicAopProxy.invoke中(当然在Cglib中是通过callback来做的,道理类似)。

通过看JdkDynamicAopProxy.invoke的源码会发现,Spring AOP的各种花招是通过Chain of Responsibility模式串起来的,先看看一个标准的Chain of Responsibility是什么样子,看下面的类图:

而Chain of Responsibility的关键在于Invocation与Interceptor的配合,主要原则就两条:

1)Invocation需要维护Interceptor集合和游标,每次调用invoke时需要先调用游标所在的Interceptor.invoke,如果游标已超过最后一个Interceptor,则调用实际target的方法

2)Interceptor的invoke中除了要执行自己的拦截逻辑,还要通过Invocation.invoke把调用传递下去,拦截的灵活性就体现在Invocation.invoke执行与否和执行的顺序。

以上逻辑通过时序图来看,如下图所示:

理解Chain of Responsibility后再来看Spring AOP,JdkDynamicAopProxy.invoke做的事情就是以上Client做的事情,

1)首先通过this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);组装interceptor chain

2)然后new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);得到invocation

3)最后通过invocation.proceed();启动责任链

而Spring AOP的那些概念都体现在组装interceptor chain中,advisor、advice和pointcut无非就是帮助你描述如何对Target进行拦截,对这一块感兴趣的朋友可以好好读读里面的代码。另外,Spring AOP提供了各种各样的Interceptor,来实现各种形式的横切,具体做法可以详细看看各Interceptor的实现。

综上所述,整个流程如下图所示:

总之,把握了Factory、Proxy、Chain of Responsibility的运用也就把握了Spring AOP的实现原理,道理虽然简单,但其中的精髓和原由还是值得我们继续深思的。

分享到:
评论

相关推荐

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.ja及ck-2.5.1.jar

    在深入学习和分析Spring源码时,有时我们需要一个完整的运行环境来理解其内部机制。"spring-cglib-repack-3.2.5.jar"、"spring-objenesis-repack-2.6.jar"和"spring-objenesis-repack-2.5.1.jar"这三个文件是Spring...

    官方原版源码 spring-5.2.8.RELEASE.zip

    总的来说,Spring框架5.2.8.RELEASE源码的学习是一次深入理解Java企业级开发、掌握模块化设计和面向切面编程理念的宝贵机会。通过深入研究源码,开发者可以提升自己的编程技巧,为开发高质量的、可维护的应用程序...

    官方原版完整包 spring-framework-5.3.6.RELEASE-dist.zip

    这包括了Spring的核心模块,如Core Container(包含Bean工厂和依赖注入)、Data Access/Integration(如JDBC和ORM支持)、Web(MVC框架和WebSocket支持)以及AOP(面向切面编程)。此外,这个包可能还包括其他相关...

    spring-cglib-repack-3.1.jar,spring-objenesis-repack-2.1.jar

    在编译Spring源码时,如果缺少这些依赖,会导致编译失败或功能不完整。因此,确保这两个jar包的正确引入对于理解和构建Spring源码是至关重要的。 在实际项目中,通常我们会通过Maven或Gradle等构建工具管理这些依赖...

    官方原版源码spring-framework-5.1.4.RELEASE.zip

    《Spring Framework 5.1.4源码深度解析》 Spring Framework是Java开发中的核心框架,它为构建高质量的企业级应用提供了全面的支持。5.1.4版本是Spring的重要里程碑,引入了诸多新特性和改进,旨在提升性能、增强可...

    阿里P7美团T8大咖带你学习Spring5源码 视频教程 下载 百度网盘链接3.zip

    47 Spring源码阅读 AOP - CreateProxy - buildAdvisor.mp4 48 Spring源码阅读 AOP - CreateProxy - getProxy.mp4 49 Spring源码中的常见的设计模式 - 桥接模式与工厂模式的配合.mp4 50 Spring源码中的常见的设计...

    阿里P7美团T8大咖带你学习Spring5源码 视频教程 下载 百度网盘链接4.zip

    47 Spring源码阅读 AOP - CreateProxy - buildAdvisor.mp4 48 Spring源码阅读 AOP - CreateProxy - getProxy.mp4 49 Spring源码中的常见的设计模式 - 桥接模式与工厂模式的配合.mp4 50 Spring源码中的常见的设计...

    阿里P7美团T8大咖带你学习Spring5源码 视频教程 下载 百度网盘链接2.zip

    47 Spring源码阅读 AOP - CreateProxy - buildAdvisor.mp4 48 Spring源码阅读 AOP - CreateProxy - getProxy.mp4 49 Spring源码中的常见的设计模式 - 桥接模式与工厂模式的配合.mp4 50 Spring源码中的常见的设计...

    阿里P7美团T8大咖带你学习Spring5源码 视频教程 下载 百度网盘链接1.zip

    47 Spring源码阅读 AOP - CreateProxy - buildAdvisor.mp4 48 Spring源码阅读 AOP - CreateProxy - getProxy.mp4 49 Spring源码中的常见的设计模式 - 桥接模式与工厂模式的配合.mp4 50 Spring源码中的常见的设计...

    spring-aop-4.2.6.RELEASE.zip

    Spring Framework Master分支则意味着这个压缩包包含了Spring框架的最新源码,开发者可以深入研究其内部机制,进行二次开发或者学习Spring的设计思想。 总的来说,"spring-aop-4.2.6.RELEASE.zip"及其关联的"spring...

    官方源码 spring-framework-5.2.15.RELEASE.zip

    结合源码学习,我们可以更好地在实际项目中运用Spring框架,例如自定义拦截器、实现数据访问的事务管理、利用Spring Boot简化应用开发等。 通过深入学习Spring Framework 5.2.15.RELEASE的源码,开发者不仅可以...

    AOP.rar-Spring-AOP源码Demo

    在本"Spring-AOP源码Demo"中,我们将深入探讨Spring AOP的工作原理以及如何通过源码学习其核心概念。 1. **AOP的基本概念** - **切面(Aspect)**:AOP的核心单元,它封装了横切关注点,包括通知(advice)、切入...

    官方原版源码spring-framework-4.3.25.RELEASE.zip

    研究Spring源码能帮助开发者提升对Java和软件设计的理解,学习最佳实践,提高代码质量和可维护性。同时,对于解决框架使用中的问题,或自定义扩展Spring功能,源码学习至关重要。 7. **未来发展趋势** 虽然Spring...

    官方原版完整包 spring-framework-5.3.1.RELEASE.zip

    这些文档包括用户指南、参考手册、API文档以及开发者指南,是学习和使用Spring框架的重要参考资料。开发者可以通过阅读这些文档深入理解Spring框架的工作原理,以及如何有效地使用其各种特性。 **spring-5.3.1-...

    spring-5.3.3-dist.zip

    在解压后的"spring-framework-5.3.3"目录中,你可以找到源码、文档、示例等资源,这将有助于深入理解Spring的工作原理,学习如何使用新特性和优化点。开发者可以通过阅读源码和官方文档,了解Spring 5.3.3的具体改进...

    my-spring.rar-Spring-AOP源码Demo

    总结来说,"my-spring.rar-Spring-AOP源码Demo"提供了学习和研究Spring AOP的实例,涵盖了切面、通知、切入点等核心概念,通过分析源码,开发者能够深入理解Spring AOP的工作机制,并能将其应用于实际的项目开发中。

    官方原版源码spring-framework-5.1.6.RELEASE.zip

    源码中的`org.springframework.aop`和`org.springframework.aop.framework`包揭示了AOP的实现机制,包括代理模式的应用和通知类型。 4. **数据访问/集成**:Spring支持JDBC、ORM(Object-Relational Mapping)框架...

    官方源码 spring-framework-5.3.2.zip

    官方源码的发布意味着开发者可以直接查看和学习Spring的实现细节,这对于理解和定制框架非常有帮助。Spring有着庞大的社区和丰富的教程资源,使得开发者能够迅速解决问题和学习新技术。 综上所述,Spring ...

    官方原版源码spring-framework-5.2.3.RELEASE.zip

    深入学习Spring源码,不仅能够帮助我们理解其工作原理,还能提升我们在实际项目中的问题排查能力。例如,当我们遇到Spring的依赖注入问题时,可以通过查看`BeanFactory`和`ApplicationContext`的相关源码来定位问题...

    spring-cglib-repack-3.2.6.jar,spring-objenesis-repack-2.6.jarspring-cglib-repack

    Spring框架是Java开发中不可或缺的一...在进行Spring源码学习或开发时,确保这两个库的正确引入是至关重要的。通过了解这两个库的作用,开发者可以更深入地理解Spring的工作原理,从而更好地利用其功能并优化应用程序。

Global site tag (gtag.js) - Google Analytics