现在的Spring相关开发都是基于SpringBoot的。最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包。如下图:

使用java -jar命令就可以运行这个独立的jar包。如下图:

这个jar包的执行入口就是一个main函数,典型的格式如下:

@SpringBootApplicationpublic class TasteSpringApplication {    public static void main(String[] args) {        SpringApplication.run(TasteSpringApplication.class, args);    }}

从代码中可以得知,SpringApplication这个类就是SpringBoot的总入口。
以上这些内容,早已是路人皆知的事情了,这里只是再赘述一遍。
进入SpringApplication这个类的源码里,首先看到的就是几个application context所使用的类。
首先是AnnotationConfigApplicationContext,这是基于注解的非web应用使用的类,它是spring-context里面的类,现在也用于SpringBoot中。
这表明对于非web应用来说,采用传统的Spring构建,或是采用现在的SpringBoot构建,核心部分并没有什么本质区别。毕竟连类都是用的同一个。
再看就是AnnotationConfigServletWebServerApplicationContext,这是基于注解的web应用使用的类,注意,这个类是SpringBoot里的类。
其实大家都知道,在还没有SpringBoot时,基于传统Spring构建web应用时使用的是AnnotationConfigWebApplicationContext这个类。
这个类位于spring-web中,显然它是Spring里面的类。(注:本文中所说的Spring指的是SpringFramework)
这里有一个问题,不知你是否发现,从Spring到SpringBoot,非web应用使用的类没有变,web应用使用的类改变了,为啥呢?
这个问题其实很简单,从它们的启动方式的差异就能很好的说明。
传统Spring构建的web应用,会打成一个war包,放入tomcat下面。
先启动tomcat,然后tomcat再去加载它下面的web应用(即war包)。
SpringBoot构建的web应用,会打成一个jar包,采用内嵌的tomcat。
先启动jar包,会进入SpringBoot中,然后再去启动tomcat。
因为现在SpringBoot要来负责启动和停止web server,这和传统Spring完全不同,所以它要自己实现一个web application context所使用的类。
由此我们可以推断出,这个类里一定有关于web server启动和停止的相关内容。
再来观察一个细节,没错,就是类名称。
传统Spring使用的类名称可以提炼出一个关键词,就是Web。SpringBoot使用的类名称可以提炼出的关键词是ServletWebServer。
前者只有Web,说明只关注web的问题,后者除了Web外还有Server,说明除了关注web外还要关注服务器,即tomcat、jetty等这些web服务器。
由此可见,从类名称上的解释和刚刚从启动方式上的解释是吻合的,是一致的。
这也说明,“时刻关注细节,你将发现更多”。这句话不仅可以用在工作当中,亦可以用在学习中、生活中。
细心的同学又会发现,后者中还有一个Servlet呢,这又怎么解释呢?
这说明这个WebServer是基于Servlet实现的。难道还有不是基于Servlet的吗?有啊,那就是基于Reactive(响应式或反应式)的。
响应式使用的类是这个AnnotationConfigReactiveWebServerApplicationContext。可以仔细对比一下名字。
Spring从5.x引入了响应式编程,这里不做深入讨论。
接着我们去源码里看看,来证实一下我们的猜想。进入ServletWebServerApplicationContext类,就是刚刚那个类的父类。
首先它定义了一个WebServer,如下图:

其次又创建了这个WebServer,如下图:

接着又启动了这个WebServer,如下图:

最后又关闭和释放了这个WebServer,如下图:

由此证明了我们的猜想,确实有关于web服务器的“全套”操作。
现在SpringBoot翻身成了主人,它不仅可以启停web服务器,还可以选择web服务器,是用tomcat、jetty还是netty,都是可以配置的。爽吧。
Spring的核心就是IOC容器,容器所作的事情就是bean定义的注册,bean的实例化、初始化、依赖的装配,bean方法的调用,bean实例的销毁。
我们先来看看bean定义的注册吧。
首先看下传统Spring的,也就是AnnotationConfigWebApplicationContext这个类的。
先定义两个成员变量,存储要注册的类和要扫描的包,如下图:

然后又用两个类AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner来负责注册类和扫描包,如下图:

最后就是具体的来执行注册类和扫描包,如下图:

接着再看下SpringBoot的,也就是AnnotationConfigServletWebServerApplicationContext这个类的。
也是先定义两个成员变量,和上面的如出一辙,如下图:

也是用相同的两个类来负责处理,如下图:

编程新说注:实例化时虽然调用的构造函数不同,但是最终执行的却是相同的构造函数。
最终执行具体的处理也是相同的,如下图:

由此可以看出传统Spring和SpringBoot在对待bean定义注册这一块,完全相同,没有任何区别。
其实这很好理解,IOC容器这块内容在Spring中已经发展的相当成熟了,是不会再有人轻易去修改它了。
因此SpringBoot和Spring在本质上没什么差别,注意这里说的是本质。
由于SpringBoot的启动方式是把自身提前把web服务器移后(即采用内嵌web服务器),所以这块是额外新增的内容。
由于SpringBoot采用根据条件(condition)自动配置的方式(AutoConfiguration),所以这块也是额外新增的内容。
这两块都是额外新增的内容,和传统Spring基本没啥关系。
因此在SpringBoot和Spring重叠的部分,其实本质没啥区别。

SpringBoot和Spring到底有没有本质的不同?的更多相关文章

  1. 品Spring:SpringBoot和Spring到底有没有本质的不同?

    现在的Spring相关开发都是基于SpringBoot的. 最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包.如下图13: 使用java -jar命令就可以运行这个独立的j ...

  2. SpringBoot集成Spring Security(7)——认证流程

    文章目录 一.认证流程 二.多个请求共享认证信息 三.获取用户认证信息 在前面的六章中,介绍了 Spring Security 的基础使用,在继续深入向下的学习前,有必要理解清楚 Spring Sec ...

  3. 【SpringBoot】Spring Boot,开发社区讨论交流网站首页。

    初识Spring Boot,开发社区讨论交流网站首页. 文章目录 初识Spring Boot,开发社区讨论交流网站首页. 1.项目简介 2. 搭建开发环境 JDK Apache Maven Intel ...

  4. Springboot集成Spring Batch

    Spring官网 (https://spring.io/projects/spring-batch#overview)对Spring  Batch的解释: 一个轻量级的.全面的批处理框架,用于开发对企 ...

  5. spring-boot (三) spring data jpa

    学习文章来自:http://www.ityouknow.com/spring-boot.html spring data jpa介绍 首先了解JPA是什么? JPA(Java Persistence ...

  6. springboot中spring.profiles.include

    springboot中spring.profiles.include的妙用. 我们有这样的一个springboot项目.项目分为开发.测试.生产三个不同阶段(环境),每个阶段都会有db.ftp.red ...

  7. SpringBoot集成Spring Security入门体验

    一.前言 Spring Security 和 Apache Shiro 都是安全框架,为Java应用程序提供身份认证和授权. 二者区别 Spring Security:重量级安全框架 Apache S ...

  8. springboot整合spring Data JPA

    今天敲代码,一连串的错误,我也是服气~果然,我们不是在出bug,就是在找bug的路上…… 今天完成的是springboot整合spring data JPA ,出了一连串的错,真是头大 java.sq ...

  9. springboot配置spring security 静态资源不能访问

    在springboot整合spring security 过程中曾遇到下面问题:(spring boot 2.0以上版本   spring security 5.x    (spring  secur ...

随机推荐

  1. ppt技巧一四步法调整段落排版

    声明:本文所有截图来源于网易云课堂--<和秋叶一起学PPT>,仅作为个人复习之用,特此声明!

  2. 基于queue的python多进程日志管理

    在我们的异常检测应用中,需要对每组IoT设备分别训练一个模型,每个模型对一组设备的指标数据进行实时异常检测.方案采用master-worker+消息队列的方式实现模型对外服务,但是每个worker的日 ...

  3. 仅用 CSS 实现多彩、智能的阴影

    背景 有没有想过如何创建从前景元素中继承某些颜色的阴影效果?阅读本文并找出如何实现方法吧! 前几天我经过家得宝(Home Depot,美国家得宝公司,全球领先的家居建材用品零售商),他们正在大规模展销 ...

  4. JVM垃圾回收器总结

    常见七种垃圾回收器以及使用的垃圾回收算法总结:

  5. 关于Java的 long,float 类型

    发现了这么一个坑: 1.2f+3.4f=4.60000014305114751.2d+3.4d=4.6

  6. 风变编程(Python自学笔记)第11关-杀死那只“机”生虫

    1.Debug:为程序排除错误. 2.SyntaxError:语法错误. 3.append()函数是列表的一个方法,要用句点.调用,且append()每次只能接受一个参数. 4.解决思路不清的两个工具 ...

  7. 25.数据结构,LinkedList ,泛型,类型通配符

    3.数据结构 数据结构是计算机存储,组织数据的方式.是指相互之间存在的一种或多种特定关系的数据元素的集合 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率 ---------常见的数据结构 ...

  8. SQLFlow的几种关系

    SQLFlow的几种关系 SQLFlow可以用来分析各种数据对象之间的依赖关系,其中包含了fdd, fdr, frd, join 四种关系 fdd:表示数据从源列到目标列的关系 frd:表示结果集返回 ...

  9. python基础之模块初识

    Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相应的Python库支持 一.time模块和datetime模块 和时间有关系的我们就要用到时间模块.在使用模 ...

  10. Java和JDK版本的关系-(转载)

    JAVA的版本最开始是1995年的JDK Alpha and Beta版本,第二年发布JDK1.0版本之后就是JDK1.1,JDK1.2.到1998年,不再叫JDK了,而是叫J2SE,但是版本号还是继 ...