Spring,SpringBoot和SpringCloud的关系。SpringBoot和Servlet的关系。
开始
上一次,我们聊到了AutowiredAnnotationBeanPostProcessor中,关于获取候选人函数列表的方法。这一次,我们收个尾,并整理一下后续的学习思路。
AutowiredAnnotationBeanPostProcessor
上一次,我们聊完了AutowiredAnnotationBeanPostProcessor中的determineCandidateConstructors,至此,SmartInstantiationAwareBeanPostProcessor接口中还剩下一个getEarlyBeanReference方法,但是,这个方法在AutowiredAnnotationBeanPostProcessor中并没有实现,所以,我们算是完成了AutowiredAnnotationBeanPostProcessor类的源码阅读。
我们了解到,AutowiredAnnotationBeanPostProcessor中,通过对字段或方法的遍历,对注解的解读,获取候选人构造函数或注入点等信息,并通过反射的方式,将依赖注入。那么,我们在后续的源码阅读系列中,会聊到,这些方法是在什么时候调用的,这样,就能把Spring中关于Bean的系列操作串联起来。
思维链路
我们不止一次的说过,在学习时,在脑海中以自己的理解,形成一个完整的思维链路,对学习的帮助是巨大的。那么,今天,我们在继续学习Spring源码前,就要完成这样的一个练习。我们决定从Bean开始。
Bean是什么?Bean是一种特殊的Java对象,特殊之处在于,它的生命周期受Spring容器管理。
Bean定义是什么?Bean定义是Spring对Bean的第三人称描述,基于Bean定义,Spring可以在不改变Java对象本身表现形式的情况下,在Java对象上附加Bean相关的属性。
Bean工厂是什么?Bean工厂就是生产Bean的工厂。这座Bean工厂,会事先依据配置或者注解,将标记为Bean的Java对象,整理成Bean定义,并保存在容器中。然后,在需要的时候,根据Bean定义,利用反射等机制,形成对象实例,注入到需要的位置。
Spring是什么?Spring就是一座Bean工厂,只是,它在这座Bean工厂的基础上,增加了一些高层建筑,这些建筑,有些提供了一易用的新特性,有些提供特定场景的解决方案。Bean工厂就像是小学课程,而其它建筑,就像是大学专业课。数数都不会,就想学统计学吗?
此时,有必要再把Spring的整体架构图再拿出来温习一下了。想一下各个模块都是干什么。
Spring架构spring-web,这一定算是一个高层建筑,它赋予Spring处理web请求的能力。
那么SpringBoot又是什么?SpringBoot是一个工作台。怎么说呢?SpringBoot之前,Spring的发展路线是不断地做加法,不断支持新的应用场景,不断提供新的组件,功能是越来越强大了,但是,用起来也就难免越来越复杂了。一大堆的依赖,一大堆的配置。怎么办呢?于是,SpringBoot来了,它就好像是一个工作台,给Spring套了一个罩子,把复杂的东西都隐藏起来,只暴露出来一块显示屏,开发者可以通过这块显示屏提供的必要功能,简单的操控原来复杂的东西,就好像是把Spring做了减法,Spring又变成单纯可爱的邻家女孩了。
SpringCloud又是什么?SpringCloud和SpringBoot可不同,它的实质,也是高层建筑,而不是工作台。它提供高可用,高并发,大数据背景下的分布式微服务解决方案。只是它的正式亮相,在SpringBoot之后,所以,很容易被误解是它是基于SpringBoot而来的,其实不是,它还是基于Spring的底层建筑而来,只是,SpringBoot这个工作台,对SpringCloud也提供了支持,这样,我们在用SpringCloud时,就能够相对简化的操作了。
Spring、SpringBoot和SpringCloud回到SpringBoot,假设我们使用SpringBoot做了一个web服务,想象一下它是怎么支持起一个web服务的?
首先,肯定要创建Bean工厂,也就是Spring容器,这个容器,负责管理各类Bean的生命周期。
接着,整合Servlet。Servlet是处理web请求的一个核心技术,springweb做了Spring和Servlet的整合。那么,是如何整合呢?是把Spring整合到Servlet中,还是把Servlet整合到Spring中?
最后,内置web容器。原来,没有SpringBoot的时候,Spring构建的web项目,最终需要放到tomcat或其它web容器中,才能被访问。但是SpringBoot不需要,这是因为,它内置了web容器。那么,如何整合的?
下次开始,我们就沿着网络请求在SpringBoot中的处理链路,来继续学习Spring的源码。
相关
Spring中,通过Autowired系列注解的required确定候选构造函数
Spring中,可通过方法参数或实例属性来进行注入
Spring中的注入是通过反射来完成的
SpringBean相关的常用注解(3)
SpringBean相关的常用注解(2)