`

SpingAOP源码研究

阅读更多

     如果之前没有读过Spring源码,建议先看一下我之前写的一个实现AOP的小demo

 

 

     在看SpingAOP源码之前先简单说一下SpingIOC的实现机制。SpingIOC的中最核心的接口是BeanFactory它更像是IOC容器的一个最基本的功能说明书,它有一个底层的实现类DefaultListableBeanFactory这个类基本上实现了BeanFactory体系中的所有重要功能,只有就是我们所熟悉的ApplicationContext。它是在BeanFactory的基础上做了扩展。继承了MessageSource, ApplicationEventPublisher, ResourcePatternResolver等接口以增强除BeanFactory基本功能之外的功能。ApplicationContext的子类基本上使用的就是DefaultListableBeanFactory。

 

IOC容器的初始化步骤:

     1> 定位Resource资源

     2> 创建DefaultListableBeanFactory

     3> 创建处理资源的BeanDefinitionReader

     4> 将Resource解析为Document

     5> 将Document解析为Spring定义的内部数据结构BeanDefinition

     6> 将BeanDefinition注册到Factory的CurrentHashMap中

     7> 创建对象(BeanFactory,Constructor,CGLIB)

     8> 解决依赖关系注入Property(期间会创建所有直接依赖或者间接依赖的类,直到这些类都创建并初始化完成之后,主类才会初始化完成)

     9> 将Bean注册到DefaultSingletonBeanRegistry的ConcurrentHashMap中 SpingIOC是非常强大的强大的副作用就是代码不容易理解。所以说肯定是没有我之前写的那个AOP小Demo好理解了。首先来看AOP通知接口的体系结构。

 

     SpingIOC是非常强大的强大的副作用就是代码不容易理解。所以说肯定是没有我之前写的那个AOP小Demo好理解了。首先来看AOP通知接口的体系结构。
       
 

之后是切入点:

   

还有一个Advisor(通知器),它用来将Advice和Pointcut组织在一起


  想要调用代理方法,必须要先有代理对象,那么代理对象是在哪产生的?代理对象其实是在一个处理器AbstractAutoProxyCreator中产生的。用过Spring中处理器的人肯定知道实现BeanPostProcessor接口,然后覆盖postProcessBeforeInitialization,postProcessAfterInitialization两个方法就可以在bean执行init方法前后来处理逻辑了。其实现原理其实很简单,在初始化Bean时可以看到如下代码



 分别是前置处理,init方法调用,后置处理。看一下生成代理对象类AbstractAutoProxyCreator的类签名



 

 

     这样明白了,其实AbstractAutoProxyCreator类就是处理器。如果一个Bean需要创建代理对象的话,就会在这个Bean的init方法执行完之后调用后置处理器创建。创建完之后就会被放置到AbstractAutoProxyCreator类中的一个ConcurrentHashMap中



 

由于我的目标对象实现了接口所以使用的是JDK代理,否则的话会使用CGLIB代理。


这是最核心的类,所有被代理的方法都会调用它的invoke方法其中有一个字段

 

	/** Config used to configure this proxy */
	private final AdvisedSupport advised;

 下面是它的截图

 


 

 

只要搞定它是怎么来的,就会知道通知,切入点,目标类是怎么产生的。

想向下追两个方法都很有用

 


 

在这里判断了是使用CGLIB创建代理还是JDK创建代理

 


 

可以看到之前那个万能的字段其实是ProxyCrentorSupport类的实例,还记得之前创建代理的AbstractAutoProxyCreator吗,它们有着共同的基类。ProxyConfig为它的子类提供了配置属性。

 


 

下面就要追一下这两个类之间是怎么建立关系的。上图调用createAopProxy(this)函数最开始的调用者是AbstractAutoProxyCreator也就是说这个this其实是ProxyFactory的实例




 

 

可以看到ProxyFactory又是ProxyCreatorSupport的子类。

那么proxyFactory又是怎么来的?



 

 

这样也就建立了ProxyCrentorSupport类与AbstractAutoProxyCreator的关系 。也就是说ProxyCrentorSupport在创建代理的工厂AbstractAutoProxyCreator与代理类之间建立了一个桥梁,真正有用的数据像通知,切入点,目标类等最初还是AbstractAutoProxyCreator提供的。ProxyCrentorSupport也起到屏蔽AbstractAutoProxyCreator中的一些敏感信息,防止被代理类获取到作用。ProxyCrentorSupport还是一个抽象工厂,是非常经典的抽象工厂模式的应用。

可以稍微追一下advisor是从哪来的



 现在来看JdkDynamicAopProxy中invoke是怎么执行的。首先它会创建一个ReflectiveMethodInvocation实例,然后让这个实例来调用proceed方法。这个ReflectiveMethodInvocation就相当于之前小Demo的ApplicationFilterChain。其结构如下



 其中每一个advice被调用时都会把自身实例传入其中,然后调完通知方法之后就会重新调用ReflectiveMethodInvocation实例的proceed方法。这样便形成了回调机制,也就实现了AOP的功能(跟我的小demo原理一样)。其他通知与前置通知类似,异常通知是直接让你执行一个try…catch块环绕的代码,这样报错之后就会被处理。至于最终通知是把proceed放在了一个try…finally中。

 

  • 大小: 7 KB
  • 大小: 24.3 KB
  • 大小: 9.8 KB
  • 大小: 4.6 KB
  • 大小: 36.6 KB
  • 大小: 12.2 KB
  • 大小: 41.8 KB
  • 大小: 20.8 KB
  • 大小: 20.4 KB
  • 大小: 48.6 KB
  • 大小: 44.8 KB
  • 大小: 23.9 KB
  • 大小: 24 KB
  • 大小: 13.2 KB
  • 大小: 12.7 KB
  • 大小: 74.1 KB
  • 大小: 16.2 KB
  • 大小: 25.4 KB
1
5
分享到:
评论

相关推荐

    老王读spring-aop源码分析&测试代码.zip

    老王读 Spring AOP 系列文章的源码分析&测试代码 帮助大家学习 Spring 源码,更加了解 Spring 的底层 博客专栏地址:https://blog.csdn.net/wang489687009/category_11269905.html

    Spring AOP 2.0 研究

    NULL 博文链接:https://cfeers.iteye.com/blog/753602

    Spring源码学习文档,绝对值得好好研究~~

    Spring源代码解析(五):Spring AOP获取Proxy.doc Spring源代码解析(六):Spring声明式事务处理.doc Spring源代码解析(七):Spring AOP中对拦截器调用的实现.doc Spring源代码解析(八):Spring驱动Hibernate的...

    spring v3.2源码

    个人觉得spring3.2的源代码比较好编译,没啥脾气,像我之前下载的spring的最新版本源代码,还有spring4.0的源代码,不论是使用jdk1.6还是1.7甚至是1.8编译都出问题,结果还是觉得spring3.2编译过程轻松一点,配合...

    研究下Spring中AOP的实现?

    NULL 博文链接:https://rmn190.iteye.com/blog/683308

    Spring技术内幕

    , 国内第一本基于Spring3.0的著作,从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码...

    ioc-aop:看完spring的源码后,自己手动实现一个类似Spring的IOC和AOP功能的演示,代码注释详细,项目可以直接运行-看

    于是经过一番研究手动实现一个类似Spring的IOC和AOP功能的演示,本demo成功实现了容器的依赖注入和切面的功能,aop使用CGLIB实现。 说明 首先代码的测试运行demo见 应用程序 public static void main(String[] args...

    spring-analysis_seaswalker.tar.gz

    Spring源码阅读 spring-core spring-aop spring-context spring-task spring-transaction spring-mvc guava-cache

    FrameSourceCodeStudy:框架源码学习

    说明: 设计模式研究设计模式学习示例代码spring-v1 Spring IOC分析和手写实现Spring IOC代码spring-v2 Spring DI分析和手写实现Spring DIITS spring-v3 Spring AOP分析和手写实现Spring AOP代码spring-v4手写Spring...

    spring:这是Spring框架研究

    七、模拟spring(AOP, IOC, DI, BeanPostProcessor及许多常用注解) 八、使用spring FactoryBean技术模拟mybatis MapperScan注解 https://github.com/AvengerEug/spring/tree/develop/implement-mapperscan 九、...

    Java毕业设计-基于ssm框架开发的游戏美术外包管理信息系统--论文-附毕设源代码+说明文档.rar

    附带的源代码经过精心编写和测试,具有良好的可读性和可维护性,方便学习者深入研究SSM框架的应用和Web开发的最佳实践。说明文档详细记录了系统的功能设计、数据库结构、关键代码实现以及可能遇到的问题和解决方案,...

    SpringAll_wuyouzhuguli.tar.gz

    循序渐进,学习Spring Boot、Spring Boot & Shiro、Spring Cloud、Spring Security & Spring Security OAuth2,博客Spring系列源码 一、Spring Boot教程 开启Spring Boot Spring Boot基础配置 Spring Boot中使用...

    Java毕业设计-基于ssm框架开发的毕业生就业信息统计系统+vue-毕业论文(附源代码).rar

    通过学习和研究该系统的源代码,可以深入了解SSM框架和Vue.js前端技术的实际应用,提升Java Web开发的技能水平。 综上所述,该资源是一个功能完善、易于扩展和定制的毕业生就业信息统计系统,对于需要进行就业信息...

    javaeye热点阅读

    1.11 Hibernate源码研究碎得整理(一到十三)1.12 解决万恶的大数问题 1.13 Excel Report 一个小巧实用基于java实现的Excel报表生成工具 1.14 Spring(十四) Spring和Hibernate的结合--声明式事务管理1.15 Apache ...

    蓝色简约风毕业答辩PPT

    在手写Spring 源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 适合人群:具备一定编程基础,工作1-3年的研发人员 ...

    Spring in Action(第2版)中文版

    a.1.1研究spring发布 a.1.2构建自己的类路径 a.2把spring添加为一个maven2依赖项 a.3spring与ant a.4spring与log4j 附录b用(和不用)spring进行测试 b.1测试简介 b.1.1理解不同类型的测试 b.1.2使用junit b....

    Spring in Action(第二版 中文高清版).part2

    A.1.1 研究Spring发布 A.1.2 构建自己的类路径 A.2 把Spring添加为一个Maven 2依赖项 A.3 Spring与Ant A.4 Spring与Log4j 附录B 用(和不用)Spring进行测试 B.1 测试简介 B.1.1 理解不同类型的测试 B.1.2 ...

    Spring in Action(第二版 中文高清版).part1

    A.1.1 研究Spring发布 A.1.2 构建自己的类路径 A.2 把Spring添加为一个Maven 2依赖项 A.3 Spring与Ant A.4 Spring与Log4j 附录B 用(和不用)Spring进行测试 B.1 测试简介 B.1.1 理解不同类型的测试 B.1.2 ...

    spring-source-study:spring原始学习

    弹簧源研究 spring原始学习 Spring原始码 主要分析Spring IOC,DI,AOP和MVC模块源码,相关模块时序图见时序图文件夹下html。 一,Spring Boot启动流程及IOC源码 Spring Boot是由Pivotal团队提供的全新框架,其设计...

    基于SpringBoot的微信订餐系统(java、源码),适合个人学习研究,本科毕业设计,课程设计等

    后端为前端提供restful化接口,接入微信SDK接口,用户通过微信扫码登录下单等,用redis存储token对用户进行识别与持久化,使用AOP技术验证卖家端登录身份信息,websocket实现消息推送实时监控订单,使用redis缓存...

Global site tag (gtag.js) - Google Analytics