前言

在上一篇的末尾,我们提到了dubbospi中增加了IoCAOP的功能.那么本篇就讲一下这个增加的IoC,spi部分预计会有四篇,因为这东西实在是太重要了.温故而知新,我们先来回顾一下,我们之前都讲了什么.

  • [从Dubbo内核聊聊双亲委派机制] 主要讲了spi的基本概念,简单的入门,并以spi为线索讲解了双亲委托模式的弊端以及解决方案

  • [Dubbo和JDK的SPI究竟有何区别?] 主要以dubbo改进了jdk的spi为线索,重点讲分析问题的思路,从实际案例实战从哪里着手分析问题这个大家最喜欢问的问题.

提到IoC,大家第一个想到的就是Spring,所以Spring的IoC也是本篇的一大重点内容.当然毕竟主题是dubbo,所以对于Spring内容,将与dubbo结合,以短小精干,但是又不缺乏深度的介绍.(后期如果大家有需要,也可以开展Spring源码专题)

看到这里可能有同学就会问,肥朝你不是写dubbo源码解析的吗,为什么还要讲Spring呢?dubbo中涉及到很多的边缘知识,其中包括SpringNettyZookeeper等等,我希望的是,大家能通过学习dubbo为主线,全面综合的提高自己,而不是为了看源码而看源码,也不是为了面试而看源码.

图片

插播面试题

  • 你提到了dubbo中spi也增加了IoC,那你先讲讲Spring的IoC,然后再讲讲dubbo里面又是怎么做的

Spring的IoC

容器

Spirng的IoC容器主要有两种,即BeanFactoryApplicationContext

  • BeanFactory是Spring中最底层的接口,只提供了最简单的IoC功能,负责配置,创建和管理bean.

  • ApplicationContext继承了BeanFactory,拥有了基本的IoC功能外,还支持

    • 国际化

    • 消息机制

    • 统一的资源加载

    • AOP

另外ApplicationContext在加载的时候就会创建所有的bean(Web应用推荐),BeanFactory需要等到拿bean的时候才会创建bean(桌面应用推荐).所以,我们一般使用ApplicationContext

总体流程

实现IoC的过程,总体可以分为两步,如下图

容器启动阶段

该阶段相当于"根据图纸装配成生产线",也就是对象管理信息的收集.

Bean实例化阶段

该阶段相当于"根据生产线来生产具体产品"

拓展

Spring提供了BeanFactoryPostProcessor的容器拓展机制,该机制允许我们在容器实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做相应的修改.

那我们有哪些实际场景有运用到这个拓展呢?

比如我们配置数据库信息,经常用到占位符

1${jdbc.url}

BeanFactory在第一阶段加载完成所有配置信息时,保存的对象的属性信息还只是以占位符的形式存在.这个解析的工作是在PropertySourcesPlaceholderConfigurer中做的,我们来看看继承体系图就明白了.

PropertySourcesPlaceholderConfigurer实现了该接口,在进入第二阶段时,已经把占位符信息替换完成.

温馨提示:

细心的同学可能发现PropertySourcesPlaceholderConfigurerPropertyPlaceholderConfigurer名字好像,这两个有什么区别?我们来看源码

图片

敲黑板划重点

为何我反复强调基础原理,难道是为了骗你关注一下我,多一个粉丝?因为基础扎实,明白原理之后很多东西真的是一通百通的,尤其了Spring Boot简化了配置,很多问题就更考验基础了.我演示一个简单的问题

首先我们发现这个占位符没有被解析,如果不知道原理你可能一脸懵逼,但是看过肥朝公众号的你,知道是缺少PropertySourcesPlaceholderConfigurer

图片

于是你高高兴兴补上了PropertySourcesPlaceholderConfigurer,发现有坑,占位符是解析出来了,但是却是null

图片

然后你通过私信联系到了肥朝,肥朝告诉你,加上个static就可以了.于是你一运行,果然是棒棒哒!

图片

但是你却百思不得其解,为啥加上了一个static就可以了呢?

原因很简单,前面都说了,这个拓展机制是在实例化对象之前,你用static修饰方法,是属于类级别的,优先级高,自然在DataSource实例化之前就完成了这个占位符的解析工作.

dubbo spi中的iOC

既然是源码解析类文章,我就尽量避免贴大段代码,否则还不如你直接去看.我用一个图来粗略描述这个大致的过程

图片

除了上一篇中对objectFactory的介绍外,从这里我们知道,objectFactory就是dubbo的IoC提供对象.

图片

SpiExtensionFactory

图片

SpringExtensionFactory

图片

dubbo在设计的时候设计了这两种方式,但是截止2.5.4版本,SpringExtensionFactory的方式尚未发现使用,可能像Java的保留字一样,给以后埋下伏笔.据说3.0版本准备出来,到时候可以关注一下SpringExtensionFactory的使用情况.

写在最后

关注肥朝公众号,后续还会有更多奇巧淫技,真实企业场景源码级实战和大家分享.让"原理"不再只是面试装逼.也欢迎大家留言一起交流精进,


更多相关文章

  1. 从解决开发环境问题聊聊为什么要看源码
  2. dubbo源码解析-简单原理、与spring融合
  3. 源码实战 | 从线程池理论聊聊为什么要看源码
  4. 源码实战 | 从一次问题排查聊聊问什么要懂原理
  5. 临摹源码 | 一比一手写Dubbo源码中的SPI(内附git地址)
  6. spring aop源码分析
  7. SpringMVC源码分析:一个request请求的完整流程和各组件介绍
  8. ConcurrentHashMap基于JDK1.8源码剖析
  9. Thread源码剖析

随机推荐

  1. AngularJS:如何从外部评估指令?
  2. 如何获取knockoutjs可观察数组的下一个元
  3. ABP(现代ASP.NET样板开发框架)系列之21、
  4. Javascript正则表达式对象和美元符号
  5. javascript-cropper插件翻译笔记
  6. javascript 构造函数中的属性与原型上属
  7. 使用Node.js初始化和配置AWS
  8. 深入浅出 Ajax 读书摘记2——【Ajax请求
  9. Javascript学习:案例7--对象属性和方法的
  10. css选择在IE中不起作用