2018-06-21Spring 技术栈

原文地址:https://juejin.im/post/5b2b020351882574b4094da0?utm_source=gold_browser_extension

本篇文章的目的是就自己阅读Spring代码和相关技术栈的一些心得体会做一些总结,方便快速上手Spring相关的技术栈,如Spring Cloud等,文章不长,大约花费5分钟时间。

(介绍一,可以略过)Spring强大的扩展能力,促进了其与新技术的融合,维护了它持久的生命力,熟悉Spring是软件特别是互联网开发人员的基本功之一,特别是在以Spring Boot为基础搭建的微服务大行其道的当下。

(介绍二,可以继续略过)Spring Boot是构建微服务的基础,它针对Spring较重的开发部署流程进行了简化,使得上下游不同框架的融合、配置开发、部署变得非常简单,但它的底层核心仍然是Spring。

Spring源码很复杂,网上相关文章也很多(建议对着文章读源码,先对整体流程主要是启动流程有个大体了解,然后再细化,以实践为导向),在此就其两大核心IOC和AOP开启两个传送门,感兴趣的同学可以看一下(文章很长,不适合碎片化阅读):

IOC:Spring IOC 容器源码分析

AOP:Spring-aop 全面解析

Spring整体来讲是个Bean的管理容器,最主要的核心就是Bean(Bean可以通过id或name区分 ,也可以通过class type区分),从XML文件或者注解声明中将Bean的定义抽象成Beandefinition(Beandefinition的来源多种多样,除了自己显示定义的,用于特殊处理的BeanDefinitionRegistryPostProcessor本身也是Beandefinition),Beandefinition通过Beanfactory管理,Beanfactory作为Applicationcontext 的内部属性,不同的Applicationcontext 之间有层级关系,在寻找bean的过程中可以沿着这种层级关系寻找(在自己内部的Beanfactory找不到的话再向上层父级寻找),然后通过Beandefinition来初始化Bean。

<figure style="display: block; margin: 22px auto; text-align: center;">[图片上传失败...(image-57a425-1529560835448)]

<figcaption style="display: block; text-align: center; font-size: 1rem; line-height: 1.6; color: rgb(144, 144, 144); margin-top: 2px;"></figcaption>

</figure>

<figure style="display: block; margin: 22px auto; text-align: center;">[图片上传失败...(image-d8bc4-1529560835448)]

<figcaption style="display: block; text-align: center; font-size: 1rem; line-height: 1.6; color: rgb(144, 144, 144); margin-top: 2px;"></figcaption>

</figure>

初始化过程中可以设立很多的扩展点(如初始化之前、之后),具体可以看BeanPostProcessor等扩展机制 (我们在开发过程中也可以结合自定义注解针对此做一些扩展开发)。

<figure style="display: block; margin: 22px auto; text-align: center;">[图片上传失败...(image-53daff-1529560835448)]

<figcaption style="display: block; text-align: center; font-size: 1rem; line-height: 1.6; color: rgb(144, 144, 144); margin-top: 2px;"></figcaption>

</figure>

IOC的原理就是通过第三方也就是Spring容器将一个Bean注入到另一个Bean(即依赖注入),通过类型、名称、构造方法等方式,循环依赖可以关注一下。

AOP的原理就是在上文描述的扩展点(即beanpostprocessor的扩展点)通过动态代理(jdk dynamic proxy和cglib要重点了解)将一个Bean转换成动态代理Bean,而动态代理Bean就可以在原本Bean的执行代码前后加入一些自己的扩展(Spring caching和Transaction都是基于此实现的)。

Spring Boot和传统Spring开发一个显著的不同就是大量的注解,注解是什么呢,就是用来描述类、字段、方法的元数据,有些可能在编译之前就被去掉了,有些会被编译进class文件,注解本身是没有什么作用的,但是在Bean处理过程中根据这些元数据做一些特殊处理,就使得注解的作用威力无穷了。

Spring Boot的Autoconfiguration机制方便了与其他框架的融合,可以看我之前的一篇文章(Spring Boot之零),通过扫描classpath下面的spring.factory文件,可以方便的将扩展类添加到Bean definition中去,针对Bean definition的扩展,可以看几个很重要的注解:configuration、import及与其有关的*ConfigurationSelector,扩展方式非常灵活,但目的只有一个,就是将相关的Bean definition加入到Beanfactory中去。

其他框架整合进Spring的时候一般绕不过这几点,通过注解将相关Bean import进去,或者在原有Bean的基础上加一些自己的逻辑返回代理Bean,而Bean也可以获取Application的各种事件触发,从而构建起强大的功能。

在看一个Spring 相关框架的过程中,通过注意这几点内容,我觉得还是比较快的:

1、看框架的整体描述,拿到开关注解(如Enable*),看import进了哪些关键Bean,特别是注意跟扩展点有关的Bean,这些Bean往往会根据注解来做一些特殊处理;

2、看框架的整体功能,关心同/异步和长/短连接以及push/pull,针对功能做一些关键点搜索,找到关键实现;

3、根据关键实现再用intellij神器做反向追溯,快速理通整个流程或者找到测试类(如*Test),通过测试类Debug代码;

4、对于影响性能的关键技术实现,就要去抠细节了,主要和Threadlocal(保存请求上下文变量)、缓存、连接池、线程池、异步非阻塞、减少运行时反射处理等有关。

通过以上的几点,我快速理清了Spring Cloud技术栈(zuul/eureka/feign/ribbon/apollo)的源码大体处理流程,不过Spring Cloud中熔断器Hystrix大量使用了响应式编程(Rxjava),这个还是比较绕的,建议先看简单的例子,琢磨清楚了subscriber是如何向上传递的以及结果集是如何向下发射的,再加上subscribeon和observeon线程池对于数据传递的影响,再去看就比较容易了。

对于Rxjava再加上一个传送门:Rxjava

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 2.1 我们的理念是:让别人为你服务 IoC是随着近年来轻量级容器(Lightweight Container)的...
    好好学习Sun阅读 2,709评论 0 11
  • IOC和DI是什么? Spring IOC 的理解,其初始化过程? BeanFactory 和 FactoryBe...
    justlpf阅读 3,468评论 1 21
  • 本来是准备看一看Spring源码的。然后在知乎上看到来一个帖子,说有一群**自己连Spring官方文档都没有完全读...
    此鱼不得水阅读 6,930评论 4 21
  • 今天我们考试了,也不知道自己考的怎么样,放学妈妈接我回来我把作业写完,晚上我们就去姥姥家了。
    九组7号杨俊逸阅读 76评论 0 0
  • 每年最少应该做一次体检,有时候我不想体检,更深层的原因是担心疾病。 更加深入的想一想,完全不需要这样的担忧,一段时...
    读书游轮阅读 71评论 0 1