dubbo源码解析-spi(3)
前言
在上一篇的末尾,我们提到了dubbo的spi中增加了IoC和AOP的功能.那么本篇就讲一下这个增加的IoC,spi部分预计会有四篇,因为这东西实在是太重要了.温故而知新,我们先来回顾一下,我们之前都讲了什么.
- spi(1) 主要讲了spi的基本概念,简单的入门,并以spi为线索讲解了双亲委托模式的弊端以及解决方案
- spi(2) 主要以dubbo改进了jdk的spi为线索,重点讲分析问题的思路,从实际案例实战从哪里着手分析问题这个大家最喜欢问的问题.
提到IoC,大家第一个想到的就是Spring,所以Spring的IoC也是本篇的一大重点内容.当然毕竟主题是dubbo,所以对于Spring内容,将与dubbo结合,以短小精干,但是又不缺乏深度的介绍.(后期如果大家有需要,也可以开展Spring源码专题)
看到这里可能有同学就会问,肥朝你不是写dubbo源码解析的吗,为什么还要讲Spring呢?dubbo中涉及到很多的边缘知识,其中包括Spring、Netty、Zookeeper等等,我希望的是,大家能通过学习dubbo为主线,全面综合的提高自己,而不是为了看源码而看源码,也不是为了面试而看源码.
插播面试题
你提到了dubbo中spi也增加了IoC,那你先讲讲Spring的IoC,然后再讲讲dubbo里面又是怎么做的
Spring的IoC
容器
Spirng的IoC容器主要有两种,即BeanFactory和ApplicationContext
- BeanFactory是Spring中最底层的接口,只提供了最简单的IoC功能,负责配置,创建和管理bean.
- ApplicationContext继承了BeanFactory,拥有了基本的IoC功能外,还支持
- 国际化
- 消息机制
- 统一的资源加载
- AOP
另外ApplicationContext在加载的时候就会创建所有的bean(Web应用推荐),BeanFactory需要等到拿bean的时候才会创建bean(桌面应用推荐).所以,我们一般使用ApplicationContext
总体流程
实现IoC的过程,总体可以分为两步,如下图

容器启动阶段

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

拓展
Spring提供了BeanFactoryPostProcessor的容器拓展机制,该机制允许我们在容器实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做相应的修改.
那我们有哪些实际场景有运用到这个拓展呢?
比如我们配置数据库信息,经常用到占位符
${jdbc.url}
当BeanFactory在第一阶段加载完成所有配置信息时,保存的对象的属性信息还只是以占位符的形式存在.这个解析的工作是在PropertySourcesPlaceholderConfigurer中做的,我们来看看继承体系图就明白了.

PropertySourcesPlaceholderConfigurer实现了该接口,在进入第二阶段时,已经把占位符信息替换完成.
温馨提示:
细心的同学可能发现PropertySourcesPlaceholderConfigurer和PropertyPlaceholderConfigurer名字好像,这两个有什么区别?我们来看源码

敲黑板划重点
为何我反复强调基础、原理,难道是为了骗你关注一下我,多一个粉丝?因为基础扎实,明白原理之后很多东西真的是一通百通的,尤其了Spring Boot简化了配置,很多问题就更考验基础了.我演示一个简单的问题
首先我们发现这个占位符没有被解析,如果不知道原理你可能一脸懵逼,但是看过肥朝博客的你,知道是缺少PropertySourcesPlaceholderConfigurer

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

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

但是你却百思不得其解,为啥加上了一个static就可以了呢?
原因很简单,前面都说了,这个拓展机制是在实例化对象之前,你用static修饰方法,是属于类级别的,优先级高,自然在DataSource实例化之前就完成了这个占位符的解析工作.
dubbo spi中的iOC
既然是源码解析类文章,我就尽量避免贴大段代码,否则还不如你直接去看.我用一个图来粗略描述这个大致的过程

除了上一篇中对objectFactory的介绍外,从这里我们知道,objectFactory就是dubbo的IoC提供对象.
public <T> T getExtension(Class<T> type, String name) {
//factories=[SpiExtensionFactory,SpringExtensionFactory]
//遍历获取spi,先从SpiExtensionFactory获取,如果没有,再从SpringExtensionFactory获取
for (ExtensionFactory factory : factories) {
T extension = factory.getExtension(type, name);
if (extension != null) {
return extension;
}
}
return null;
}
SpiExtensionFactory
public <T> T getExtension(Class<T> type, String name) {
if (type.isInterface() && type.isAnnotationPresent(SPI.class)) {
ExtensionLoader<T> loader = ExtensionLoader.getExtensionLoader(type);
if (loader.getSupportedExtensions().size() > 0) {
return loader.getAdaptiveExtension();
}
}
return null;
}
SpringExtensionFactory
public <T> T getExtension(Class<T> type, String name) {
for (ApplicationContext context : contexts) {
if (context.containsBean(name)) {
//从容器中获取注入的对象
Object bean = context.getBean(name);
if (type.isInstance(bean)) {
return (T) bean;
}
}
}
return null;
}
dubbo在设计的时候设计了这两种方式,但是截止2.5.4版本,SpringExtensionFactory的方式尚未发现使用,可能像Java的保留字一样,给以后埋下伏笔.据说3.0版本准备出来,到时候可以关注一下SpringExtensionFactory的使用情况.
Ref:
https://www.jianshu.com/p/718acbda838c
dubbo源码解析-spi(3)的更多相关文章
- dubbo源码解析-spi(4)
前言 本篇是spi的第四篇,本篇讲解的是spi中增加的AOP,还是和上一篇一样,我们先从大家熟悉的spring引出AOP. AOP是老生常谈的话题了,思想都不会是一蹴而就的.比如架构设计从All in ...
- dubbo源码解析-spi(一)
前言 虽然标题是dubbo源码解析,但是本篇并不会出现dubbo的源码,本篇和之前的dubbo源码解析-简单原理.与spring融合一样,为dubbo源码解析专题的知识预热篇. 插播面试题 你是否了解 ...
- dubbo源码解析-spi(二)
前言 上一篇简单的介绍了spi的基本一些概念,在末尾也提到了,dubbo对jdk的spi进行了一些改进,具体改进了什么,来看看文档的描述 JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩 ...
- Dubbo源码(二) - SPI源码
前情提要 假设你已经知道Dubbo SPI的使用方式,不知道的请出门左转: Dubbo源码(一) - SPI使用 Dubbo源码地址: apache/dubbo 本文使用版本:2.6.x 测试Demo ...
- dubbo源码解析五 --- 集群容错架构设计与原理分析
欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 博客园 Dubbo 入门之二 --- 项目结构解析 博客园 Dubbo 源码分析系列之 ...
- Dubbo 源码解析四 —— 负载均衡LoadBalance
欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 Dubbo 入门之二 --- 项目结构解析 Dubbo 源码分析系列之三 -- 架构原 ...
- dubbo源码解析-zookeeper创建节点
前言 在之前dubbo源码解析-本地暴露中的前言部分提到了两道高频的面试题,其中一道dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?在上周的dubbo源码 ...
- Dubbo源码解析之SPI(一):扩展类的加载过程
Dubbo是一款开源的.高性能且轻量级的Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用.智能容错和负载均衡,以及服务自动注册和发现. Dubbo最早是阿里公司内部的RPC框架,于 ...
- 【Dubbo 源码解析】02_Dubbo SPI
Dubbo SPI:(version:2.6.*) Dubbo 微内核 + 插件 模式,得益于 Dubbo SPI .其中 ExtentionLoader是 Dubbo SPI 最核心的类,它负责扩展 ...
随机推荐
- linux学习笔记-9.查找
1.查找可执行的命令 which ls 2.查找可执行的命令和帮助的位置 whereis ls 3.查找文件(需要更新库:updatedb) locate hadoop.txt 4.从某个文件夹开始查 ...
- 循序渐进学.Net Core Web Api开发系列【16】:应用安全续-加密与解密
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 应用安全除 ...
- [mysql] update……from……
今天插入一条数据就像这样 limit ), , )) 然后报错: You can't specify target table 'categorys' for update in FROM claus ...
- luoguP4000 斐波那契数列
题目链接 luoguP4000 斐波那契数列 题解 根据这个东西 https://www.cnblogs.com/sssy/p/9418732.html 我们可以找出%p意义下的循环节 然后就可以做了 ...
- KVM源代码阅读--内核版本3.17.4
为了更加深入的学习虚拟化,因此我必须把KVM源代码搞清楚,这是一个必须要挖的坑.我会把自己的一些阅读的代码贴上来,可能会有理解不对的地方,希望和大家一起交流,请多提意见,以便于纠正错误.所用的内核版本 ...
- java自动给版本升级,遇9变0且前面一个版本加1
/** * 自动升级版本号,版本号+1 * @param version * @return */ private String autoUpgradeVersion(String version){ ...
- Nginx担当WebSockets代理
Nginx担当WebSockets代理 英文原文:http://nginx.com/blog/websocket-nginx/ 作者:chszs,转载需注明. 博客主页:http://blog.csd ...
- ubuntu单独安装字体包
查看当前字体的命令: fc-list 文泉驿字体下载地址: http://wenq.org/wqy2/index.cgi?ZenHei#v0_8 下载到的是一个deb安装包 在下载完字体以后将字体包拷 ...
- [Go] Beego 模板嵌套 使用总结
通过以下文章,掌握了 Go 模板引擎 的基本用法: [Go] Template 使用简介 [Go] 模板嵌套最佳实践 Beego模板语法指南 但在开始学习 Beego 框架的 模板嵌套 模块源码时,有 ...
- [译] Go 并发编程基础
原文:Fundamentals of concurrent programming 译者:youngsterxyf 本文是一篇并发编程方面的入门文章,以Go语言编写示例代码,内容涵盖: 运行期并发线程 ...