Spring Boot 在前几年就已经大火了,如今几乎新项目都是以Spring Boot框架搭建的。不过很多人对Spring Boot的了解都是基本使用,也就是在使用层面上非常了解,这种掌握程度其实应付日常的开发足够了,但是一旦碰到不常见的控制台异常信息,或者越来越内卷的面试,就显得知识匮乏了。所以平时还是要抽时间加深对Spring Boot框架的学习,不管是为了面试,还是平常开发过程的疑难杂症的解决,扩展知识的深度还是很有必要的。
这里我先抛出几个问题,以此对Spring Boot有一个新的认识。
Spring Boot框架 与 SSM框架 的区别
这种问题我经常在在一些自媒体文章的评论下看到,比如一篇讲解SSM框架相关技术方面的文章,下面评论中有人问 “小白如何学习Spring框架?”,下面肯定有人会回复 “别学SSM了,SSM都过时了,直接学习Spring Boot吧”。我相信这种场景大家都见到过。
其实我个人是不太认同这种回答的!
直接学习Spring Boot并不利于新人对Spirng框架的掌握。
如果你单纯的从开发使用角度来看,那SSM和Spring Boot对业务开发者没有太大区别,都是一样的Controller 到 Service 到 dao 这么开发方式,其中所用到的注解不外乎@RestController,@Service,@Autowired等等。
如果你从项目搭建角度来看,那Spring Boot要比SSM简单太多了,几乎是傻瓜式操作。仅需要引一个starter依赖,创建main函数就可以启动了。而SSM就麻烦了,要么创建web.xml,要么使用Spring MVC提供的抽象类 AbstractAnnotationConfigDispatcherServletInitializer ,第二种启动方式,你不看官方文档都不一定知道,太多博客都是以web.xml这种方式创建而传承到下一个阅读博客的人的。。。
基于以上两点我们想想,你想学习Spring,这两种方式哪个比较好?
-
如果你要系统学习,我建议你选择SSM这种原始方式,你在搭建项目的时候,你会从Servlet入口到Spring的父子容器,到Mybatis的各种配置,其它需要的功能的bean的创建等等,你都会从手到脑过一遍,这些过程即使在Spring Boot里也是无法避免的,仅仅是Spring Boot一些starter对其进行了封装,帮你自动配置了,你感觉不到它的存在。而Spring Boot对其进行的封装是很深又很复杂的,它要对一些功能给框架扩展人员预留很多实现类扩展点,从而让一个核心类变得很复杂,包装了很多层。而这就对新手不太友好了,很容易中途放弃。
-
如果你只是想快速掌握Spring的开发流程,快速进行业务开发,或者自己搭建demo研究一些第三方组件的使用,那选择Spring Boot无可厚非。Spring Boot当初的目的就是简化项目的搭建过程,不再让开发人员为各种bean的配置头疼,约定大于配置,直接给出你的默认自动配置,入手直接开发。让你直接从0到100;而不是SSM那样 0,1, 2, 3, …, 50, …, 100。
扯远了,回到问题,Spring Boot 和 SSM到底区别在哪里呢?
-
首先从入口看,SSM在Servlet3.0前,都是以web.xml为起点,需要外置Tomcat(Tocmat插件)先启动,然后解析web.xml,寻找Servlet。
Servlet3.0后,不再需要web.xml,它基于SPI机制可以查找ServletContainerInitializer类代替web.xml功能,但是一样还是要外置Tomcat先启动才可以。
而Spring Boot则是在Tomcat某个版本提供了内置启动方式,也就是使用 new Tomcat()这种方式,这样才得以我们现在看到的main函数启动,将tomcat的创建和启动封装在内部一个时间节点执行。
所以说Spring Boot的出现是其他技术发展成熟到一定阶段的结果。 -
再从中间看,Spring Boot最核心最有亮点的功能-----自动配置。其实Spring Boot的自动配置并不是依赖于其他技术的发展,也就是说就算你用SSM也可以玩一个自动配置功能,自动配置更多的是体现在一种设计理念上。它将常用的一些功能所用到的类提前以JavaConfig方式定义在配置类中,控制好配置类是否可以注册到容器中即可,当然这些说起来容易,做到还是很难的,需要你对底层源码足够的了解。
-
最后从项目部署来看,Spring Boot通常以jar包启动,SSM一般要打成war包。其实这点区别也来源于第一点说的,根上还是内置Tomcat提供的好处得以jar包启动。
主要还是上边的1和2吧。其它一些区别,比如说有人面试经常说的Spring Boot直接把配置写在yml里,这东西说到根上还是自动配置的功能。还有的一些诸如Spring Boot不需要再定义各种xml文件,这也是自动配置的功能,哈哈。
Spring 和 Spring Boot 的区别
这个问题经常在一些面试题中见到,很多博客文章也经常以这个问题为主题。
个人观点,Spring Boot 算是Spring的升级版,或者说是套娃版本。Spring Boot最大的特色功能自动配置,底层也是利用了Spring的基础注解@Import。经常说的条件配置注解如@ConditionalOnClass等注解内部也是利用了Spring的@Conditional注解来实现的,可以说没有Spring 的前期铺路,不会有现在Spring Boot这么丰富的功能。你如果对Spring特别了解后,后续学习Spring Boot就会非常简单,随便一个功能注解都是Spring的注解或者扩展点来实现的。(内嵌Tomcat,使用main函数启动,这不算Spring Boot专属特有功能,你自己将来也可以new Tomcat(),对Tomcat进行优化,再结合Spring Framework的扩展点,针对你们公司的业务,做一个定制化,你给它起个高大上的框架名字也可以)
所以万一什么时候市场上再出来个Spring A,B,C,D框架,也不用慌,它离不开Spring框架那一套。
所以说想要学习Spring Boot,想要了解它底层机制,就需要对Spring Framework了解的越深越好。
搭建Spring Boot工程
这一块其实没啥好说的,网上有太多教程了。
我写这篇博客时,Spring Boot已经推出了Spring Boot 2.5版本 GA版本,对应的Spring 版本时 5.3.7。
我用IDEA自带的Spring Initializr默认创建的就是2.5版本的Spring Boot工程。
选择JDK版本为 JDK8。
依赖选择,仅选择了Web功能,直接下一步。
继续下一步,就创建完了。这过程确实很简单。。。。。
最终项目结构如下,依赖自动帮我们选择 spring-boot-starter-web 这个starter依赖。
这时候,就可以直接Main启动一个Web项目了,相比于SSM那一套简直不要太简单。
看log可以知道,默认端口号 8080。如果有需要,你就可以随时写Controller了。如果需要其他依赖,在Pom文件里引入即可。
好,Spring Boot的简单介绍到这里就结束。不过提前说明一点,这里搭建的demo用的版本时Spring Boot 2.5。后期编译源码,学习源码我用的时Spring Boot 2.2.8版本。因为从2.3版本开始,Spring Boot 官方的源码就是默认以Gradle构建,我实在懒得学习Gradle了,项目管理用Maven用习惯了。所以后期的博客就是以Spring Boot 2.2.8版本为主。