`
windowboy
  • 浏览: 16338 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring AOP源码解读

 
阅读更多


                                                Spring AOP源码解读

advice通知

   定义在连接点做点什么,为切面增强提供织入接口,在Spring AOP中,主要描述围绕方法调用而注入的切面行为。

Pointcut切点  

Pointcut(切点)决定Advice通知应该作用于哪个连接点,也就是通过Pointcut来定义需要增强的方法的集合。Pointcut通常意味着标识方法



 

在接口PointCut中定义了MethodMatcher getMethodMatcher()方法,由这个方法来判断是否需要对当前方法调用进行增强,或者是否需要对当前调用方法应用配置

好的Advice通知。

在如上图的继承关系中,JdkRegexpMethodPointcut类完成通过正则表达式对方法名进行匹配的功能。

Advisor通知器

完成目标方法的切面增强设计(advice)和关注点的设计(Pointcut·)以后,需要一个对象把它们结合起来,完成这个作用的就是Advisor(通知器)。

可以看看一个实现了advisor的类



 

DefaultPointcutAdvisor中有两个属性 advicePointcut

Spring AOP的设计和实现

    Spring AOP实现中,使用的核心技术就是动态代理。

   SpringAOP模块中,一个主要的部分是代理对象的生成,而对Spring应用,可以看到,是通过配置和调用ProxyFactoryBean来完成这个任务,在ProxyFactoryBean

封装了主要代理对象的生成过程

<!--EndFragment-->



  

 

ProxyFactoryBean 在继承体系上和ProxyFactory并没有太多差异,但是ProxyFactoryBean实现了 BeanFactoryAware, BeanClassLoaderAware, FactoryBean 三个接口,

 

那么ProxyFactoryBean IOC容器有了交融的地方了,ProxyFactoryBean 正是借助IOC容器的配置,找到Advice增强和target对象

 

ProxyFactoryBean

 

   在了解ProxyFactoryBean的实现之前,先简单介绍一下使用和配置  

<!--EndFragment-->

 先穿插一下动态代理的实现

 



 

 

 

 

运行结果为

 

<!--EndFragment-->

 

使用AOP的继承类来实现拦截

 

 增加一个实现前置通知
 
 

 

 

使用XML配置的形式如下:

 

<!--EndFragment-->

 

 

使用拦截 1> 定义通知器Advisor,这通知器的实现定义了需要对目标对象进行增强的切面行为,也就是Advice通知。

 

         2>定义ProxyFactoryBean,用来封装AOP功能的主要类,在配置这个类的时候,需要设定与AOP实现相关的属性例如 proxyInterface

 

           interceptorNamestarget.

 

 

 

 

 

ProxyFactoryBean的AOP实现需要依赖JDK或者CGLIB提供的Proxy特性。从FactoryBean中获取对象,是以getObject()方法作为入口完成。

 

对于ProxyFactoryBean需要把对target目标对象增加的增强处理,都是通过getObject方法进行封装,这些增强处理是AOP功能的实现提供服务。



 

 

这些拦截器都是从配置文件中读取,然后为代理对象的生成做好准备。由于代理对象有singleton类型和prototype类型





 

初始化连接器,形成拦截器链。对于Singleton的代理对象在getSingletonInstance()代码中完成,这个方法是ProxyFactoryBean生成AOPProxy代理对象的调用入口

<!--EndFragment-->



 

 

具体的代理对象的生成,是在ProxyFactoryBean的基类AdvisedSupport的实现中借助AopProxyFactory来完成的

ProxyCreatorSupport类中生成AOPProxy对象

<!--EndFragment-->



 

AopProxyFactory使用的是

 

另外对代理对象的生成,需要考虑用哪种生成方式,如果目标对象是接口类,那么用JDK来生成代理对象,否则采用CGLIB来生成目标对象的代理对象。

 

AopProxy代理对象的生成过程中,首先要从AdvisedSupport对象中取得配置的目标对象,对目标对象进行检测

 需要根据配置的情况来决定使用什么方式来创建AopProxy代理对象。

主要介绍一下JDK生成AOPProxy代理对象的方式

JdkDynamicAopProxy中,使用了Proxy类来生成代理对象。

<!--EndFragment--><!--EndFragment-->



 

连接器链(通知切入集合),代理对象的生成的流程如下:



 
Spring AOP连接器调用链的实现

JdkDynamicAopProxy实现了InvocationHandler接口,对Proxy对象的代理设置是在invoke方法中实现的,如下:



 



如上代码所示,如果没设置拦截器,那么会对目标对象的方法直接进行调用。对于JdkDynamicAopProxy代理对象,这个对目标对象的方法调用是通过AopUtils使用反射机制

invokeJoinpointUsingReflection方法

<!--EndFragment-->

 

对拦截器的的目标对象的增强,是调用ReflectiveMethodInvocation类的

<!--EndFragment-->

 

其中生成连接器链从类 DefaultAdvisorChainFactory

<!--EndFragment-->

 

整个的AOP拦截调用如下图:

<!--EndFragment-->

 
 

  


 
 

 

<!--EndFragment-->
  • 大小: 24.9 KB
  • 大小: 32.3 KB
  • 大小: 15.1 KB
  • 大小: 2.8 KB
  • 大小: 7.1 KB
  • 大小: 19.8 KB
  • 大小: 13.3 KB
  • 大小: 1.2 KB
  • 大小: 10.3 KB
  • 大小: 15.3 KB
  • 大小: 20.5 KB
  • 大小: 12.8 KB
  • 大小: 44.1 KB
  • 大小: 20.4 KB
  • 大小: 24.5 KB
  • 大小: 5.6 KB
  • 大小: 10.3 KB
  • 大小: 3.3 KB
  • 大小: 20.3 KB
  • 大小: 15.7 KB
  • 大小: 25.2 KB
  • 大小: 39.9 KB
  • 大小: 38.7 KB
  • 大小: 27.3 KB
  • 大小: 41.7 KB
  • 大小: 37.5 KB
  • 大小: 19.9 KB
  • 大小: 28.9 KB
  • 大小: 19.9 KB
分享到:
评论

相关推荐

    spring-aop源码解读

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许程序员在不修改源代码的情况下,通过添加额外的行为(即“切面”)来增强应用程序的功能。在Spring AOP中,主要有三个核心概念:Advice、Pointcut和...

    spring-aop.pdf 源码电子书

    标题和描述中提到的是关于Spring AOP源码的电子书。Spring AOP(Aspect-Oriented Programming)是Spring框架的一个重要组成部分,它支持面向切面编程的实践,是为了解决面向对象编程中的横切关注点问题而设计的。在...

    spring-aop.rar_aop1270_spring_spring aop

    Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP的源码分析,探讨其核心概念、工作原理以及在...

    spring源码分析(1-10)

    Spring 源代码分析系列涵盖了多个关键模块,包括事务处理、IoC容器、JDBC、MVC、AOP以及与Hibernate和Acegi安全框架的集成。以下是对这些知识点的详细阐述: 1. **Spring 事务处理**:Spring 提供了声明式事务管理...

    spring aop

    压缩包中的文件 "spring aop源代码分析.doc" 可能包含了对Spring AOP源代码的详细解读,分析了其关键类和方法,比如`org.springframework.aop.framework.ProxyFactoryBean`、`org.springframework.aop.aspectj....

    菜鸟 Spring 源码解读 推荐流程

    4. **AOP**:面向切面编程允许我们在不修改源代码的情况下,插入跨切面关注点,如日志、事务管理等。 5. **ASPECTJ**:Spring支持AspectJ,一种强大的编译时和运行时AOP框架,可以方便地定义切面和通知。 6. **MVC...

    spring源码解读-地址.txt

    根据提供的文件信息,本次解读将围绕Spring框架的核心概念与源码分析进行展开。Spring框架作为Java企业级开发中不可或缺的一部分,其源码的学习对于深入理解框架机制、提高开发效率具有重要意义。下面,我们将从以下...

    Spring源码解读.pptx

    Spring Framework的源码解读是一个复杂而深邃的主题,涵盖了诸如Bean的生命周期管理、AOP的实现、IoC容器的工作原理、事件模型等多个方面。理解这些概念不仅有助于提升我们的编码技能,还能帮助我们更好地设计和维护...

    Spring框架核心源代码的分析及其感受-6

    《Spring框架核心源代码分析及感悟》 Spring框架作为Java企业级应用开发的基石,其强大的功能和灵活性深受开发者喜爱。深入理解Spring的核心源代码,不仅有助于我们更好地使用这个框架,还能提升我们的编程技艺和对...

    spring 源码中文注释

    这份"spring 源码中文注释"包含了对Spring框架源码的详细解读,对于理解其工作原理、优化代码以及定制化开发具有重要意义。 首先,我们来看看Spring的核心组件——IoC容器。IoC容器是Spring的核心,它负责管理对象...

    spring源码解读.txt

    ### Spring框架核心概念与源码解析 #### 一、Spring框架简介 Spring是一个开源的Java应用框架,由Rod Johnson创建并领导开发。Spring的核心特性包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect ...

    Spring事务源码解读.doc

    - **AOP代理**:Spring通过AOP(面向切面编程)实现事务的管理,当事务方法被调用时,Spring会创建一个代理对象,拦截方法调用并在适当的时候进行事务控制。 - **事务边界**:事务的边界由`@Transactional`注解...

    【狂神说】spring 总结源码 下载

    Spring框架是Java开发中最常用的...在"Spring-study"这个压缩包中,可能包含了关于Spring框架的源码解读、关键类的分析、实战示例等内容,通过对这些资料的学习,我们可以深化对Spring的理解,提升自己的Java开发能力。

    spring核心源码详细解读

    ### Spring核心源码详细解读 #### 一、Spring框架概览及IoC容器的重要性 Spring框架作为一款轻量级的企业级应用开发框架,其核心功能是IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming...

    【面试资料】-(机构内训资料)看透Spring MVC源代码分析与实践.zip

    这份【面试资料】-(机构内训资料)看透Spring MVC源代码分析与实践.zip文件很可能是为了帮助求职者准备相关面试问题而设计的,包含了对Spring MVC工作原理、关键组件和源码解读的详尽解析。 1. **Spring MVC基本...

    Spring源代码解析(六):Spring声明式事务处理.doc

    在整个源代码分析中,我们可以看到 Spring 实现声明式事务管理有三个部分: 1. 对在上下文中配置的属性的处理,这里涉及的类是 TransactionAttributeSourceAdvisor,这是一个通知器,用它来对属性值进行处理,属性...

    Spring Boot实战与原理分析视频课程包含14-18

    20 Spring Boot AOP 21 Spring Boot Starter18:31 --快速构建自定义的Spring Boot Starter 22 Spring Boot 日志30:58 --演示了如何在Spring Boot里面使用日志配置,以及logback,log4j2等日志的使用 23 Spring ...

    spring源码深入解析

    《Spring源码深入解析》是一本深度探讨Spring框架核心机制的文档,主要针对Spring5版本...文档《Spring源码解析-tom.docx》应包含了上述各方面的详细解读,对于希望深入了解Spring的开发者来说,是一份宝贵的参考资料。

    spring基于5.3.x版本源码解读

    在这个版本中,Spring 源码解读可以帮助我们深入理解其内部机制,从而更好地利用其功能并优化我们的代码。 首先,让我们探讨Spring框架的基础部分。Spring的核心设计理念是依赖注入(Dependency Injection,DI),...

Global site tag (gtag.js) - Google Analytics