(介绍一,能够略过)Spring强大的扩展能力,促进了其与新技术的融合,维护了它持久的生命力,熟悉Spring是软件特别是互联网开发人员的基本功之一,特别是在以Spring Boot为基础搭建的微服务大行其道的当下。java
(介绍二,能够继续略过)Spring Boot是构建微服务的基础,它针对Spring较重的开发部署流程进行了简化,使得上下游不一样框架的融合、配置开发、部署变得很是简单,但它的底层核心仍然是Spring。spring
Spring源码很复杂,网上相关文章也不少(建议对着文章读源码,先对总体流程主要是启动流程有个大致了解,而后再细化,以实践为导向),在此就其两大核心IOC和AOP开启两个传送门,感兴趣的同窗能够看一下(文章很长,不适合碎片化阅读):编程
Spring总体来说是个Bean的管理容器,最主要的核心就是Bean(Bean能够经过id或name区分 ,也能够经过class type区分),从XML文件或者注解声明中将Bean的定义抽象成Beandefinition(Beandefinition的来源多种多样,除了本身显示定义的,第三方注解引入的,BeanDefinitionRegistryPostProcessor(如ConfigurationClassPostProcessor)可用于引入Beandefinition),Beandefinition经过Beanfactory管理,Beanfactory做为Applicationcontext 的内部属性,不一样的Applicationcontext 之间有层级关系,在寻找bean的过程当中能够沿着这种层级关系寻找(在本身内部的Beanfactory找不到的话再向上层父级寻找),而后经过Beandefinition来初始化Bean。微信
初始化过程当中能够设立不少的扩展点(如初始化以前、以后),具体能够看BeanPostProcessor等扩展机制 (咱们在开发过程当中也能够结合自定义注解针对此作一些扩展开发)。框架
IOC的原理就是经过第三方也就是Spring容器将一个Bean注入到另外一个Bean(即依赖注入),经过类型、名称、构造方法等方式,循环依赖能够关注一下。异步
AOP的原理就是在上文描述的扩展点(即beanpostprocessor的扩展点)经过动态代理(jdk dynamic proxy和cglib要重点了解)将一个Bean转换成动态代理Bean,而动态代理Bean就能够在本来Bean的执行代码先后加入一些本身的扩展(Spring caching和Transaction都是基于此实现的)。微服务
Spring Boot和传统Spring开发一个显著的不一样就是大量的注解,注解是什么呢,就是用来描述类、字段、方法的元数据,有些可能在编译以前就被去掉了,有些会被编译进class文件,注解自己是没有什么做用的,可是在Bean处理过程当中根据这些元数据作一些特殊处理,就使得注解的做用威力无穷了。oop
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 相关框架的过程当中,经过注意这几点内容,我以为仍是比较快的:
一、看框架的总体描述,拿到开关注解(如Enable*),看import进了哪些关键Bean,特别是注意跟扩展点有关的Bean,这些Bean每每会根据注解来作一些特殊处理;
二、看框架的总体功能,关心同/异步和长/短链接以及push/pull,针对功能作一些关键点搜索,找到关键实现;
三、根据关键实现再用intellij神器作反向追溯,快速理通整个流程或者找到测试类(如*Test),经过测试类Debug代码;
四、对于影响性能的关键技术实现,就要去抠细节了,主要和Threadlocal(保存请求上下文变量)、缓存、链接池、线程池、异步非阻塞、减小运行时反射处理等有关。
经过以上的几点,我快速理清了Spring Cloud技术栈(zuul/eureka/feign/ribbon/apollo)的源码大致处理流程,不过Spring Cloud中熔断器Hystrix大量使用了响应式编程(Rxjava),这个仍是比较绕的,建议先看简单的例子,琢磨清楚了subscriber是如何向上传递的以及结果集是如何向下发射的,再加上subscribeon和observeon线程池对于数据传递的影响,再去看就比较容易了。
对于Rxjava再加上一个传送门:Rxjava