最近,笔者有幸受邀参加了由OSCHINA举办的《高手问答》活动。在第251期-轻量级Java Web企业应用实战-SSM整合开发,笔者有关 SSM 的一些问题与读者进行了互动。在一问一答的交流过程中,将这些问题的核心知识点做些归纳总结。

小编说:很多人名义上是学习Spring Boot,其实学的是Spring、Spring MVC、MyBatis等框架的内容,这种方式的学习实际上带有一定误导性,如何学习SSM和Spring Boot呢?本文给出了三点建议。

Spring Boot和SSM的关系
如果你要问我,现在开发企业级的应用是否应该使用Spring Boot框架?
我的回答是肯定的。不仅如此,我甚至推荐将原来基于S2SH、SSM开发的项目都重构成基于Spring Boot的——前提是你有扎实的技术功底,不担心重构过程中引入一些未知的错误、最后导致项目出错。
▊ 为何如此推崇Spring Boot?
这是由企业开发的特性所决定的,对于企业开发来说,必须追求稳定性快捷性,而Spring Boot的作用是什么?
Spring Boot是一个快速整合和自动配置的脚手架框架。
形象地说,Spring Boot就像一种快速、有效的“万能胶,它几乎能将Java领域的所有框架与Spring框架迅速地整合在一起,而且由于Spring Boot为这些框架的整合提供了自动配置功能,因此整合它们几乎不需要提供额外的配置信息——不仅不需要提供XML配置,甚至连注解都可以省略。
当然,Spring Boot依然保留了扩展接口,因此开发者依然可使用传统的Spring配置文件来提供额外的自定义配置,这意味着开发者既可充分利用Spring Boot自动配置的便捷性,也可保留Spring传统配置方式的灵活性。
简单来说,使用Spring Boot框架进行开发无非就是以下两个优点:
  • 快速整合
  • 自动配置
▊ Spring Boot能做其他事情吗?
不能!Spring Boot本身并没有提供其他功能性的东西,Spring Boot它只是一瓶强大的“万能胶”,如果你希望这瓶“万能胶”能发挥作用,那么你至少要有一些东西用来被“万能胶”去粘。
伴随着Spring Boot的广泛应用(正如前文我所推荐的,我也极力推荐使用Spring Boot),所以有一些菜鸟(尤其是那些刚工作几年的菜鸟)往往跟着以讹传讹地传递一个错误的观念:SSM过时了、Hibernate/JPA过时了,现在只要学习Spring Boot就够了。
正如前文所介绍的,Spring Boot的目的无非是两个:快速整合自动配置,如果没有Spring MVC、没有Spring、没有MyBatis、没有Hibernate/JPA……等框架,那Spring Boot整合谁呢?
懂得了SSM(Spring MVC+Spring+MyBatis)与Spring Boot的关系之后,自然就能明白认扎实掌握SSM的重要性。反过来,有了扎实的SSM基础之后,再去学习Spring Boot所提供的快速整合和自动配置功能,就不至于流于表面的学习,而是能真正掌握Spring Boot的底层实现机制和原理。
实际上,如果你查看Spring Boot框架的官方文档,会看到如下文字:
“Automatically configure Spring and 3rd party libraries whenever possible(尽可能自动配置Spring及第三方框架)”。
这段文字说过
Spring Boot能代替Spring及第三方框架吗?
没有。Spring Boot所做的只不过是尽可能地自动配置Spring及第三方框架,这句话本身就说明了Spring Boot强烈地需要Spring及第三方框架,否则Spring Boot自动配置谁呢?

网络上那些以讹传讹的菜鸟,他们学习Spring Boot,通常只是学习了一些皮毛。很多时候,他们以为自己在学习Spring Boot,但其实不是。比如很多图书名义上说介绍Spring Boot,实际上却对@RestController、@PathVariable、@MatrixVariable 等注解讲了一通,这些内容属于Spring Boot吗?你只要看一些这些注解所在的包,就会发现它们和Spring Boot没有半毛钱的关系。
如果非要说这些注解和Spring Boot有关系,那就是它们都属于被Spring Boot整合的框架,如果从这个角度来说,那Spring Boot几乎能和Java领域所有框架都有关系了——前文Spring Boot的官方文档都已经说了:“尽可能自动配置Spring及第三方框架”,因此Spring Boot能快速整合、自动配置的框架恐怕比绝大部分开发者知道的框架还要多,难道这些框架都属于Spring Boot?
由此可见,不管你是否意识到:只要你打算认真学习Spring Boot,就不可能避免学习Spring、Spring MVC、MyBatis、Hibernate/JPA……这些框架——因为Spring Boot只是去整合这些框架,但真正起作用的依然是SSM这些框架。
从实际开发的角度来看,Spring Boot所能做到事依然是快速整合和自动配置。在项目搭建阶段,借助于Spring Boot的快速整合,开发者可以快速地搭建出一个企业级项目;在项目开发阶段,Spring Boot的自动配置功能可以减少配置信息的书写,但开发阶段依然还是要开发各种应用组件,依然要实现业务逻辑,依然要去访问数据库,实现这些功能还是要用到Spring、Spring MVC、MyBatis、Hibernate/JPA等框架。
换而言之,对于实际开发而言,开发者往往并不需要真正与Spring Boot打交道,真正用到的反而是Spring、Spring MVC、MyBatis、Hibernate/JPA等框架,因为它们才是真正干活的框架。
不会Spring,不谈就业
新名词往往容易让人眼花,但沉淀下来的才是真正的“大佬”。如果你问我学精Java就能就业吗?我会扎扎实实地告诉你一个否定的答案!
当你问到“学精Java”这个前提时,已经说明了你可能还不知道Java所涉及的知识面有多广,全世界绝大部分企业级应用的后端程序,几乎都是Java在支撑,如果你还只是把Java当成一门孤立的编程语言,那你已经错了。
Java是一个庞大的生态圈和解决方案,它涉及大量的应用领域,比如后端开发、分布式开发、大数据、人工智能……;它也涉及无数的框架和技术:Spring、MyBatis、Hibernate/JPA、ActiveMQ、RocketMQ、ZooKeeper、Hadoop、Kafka、Flink、Spark、Lucene、Solr/ Elasticsearch……
在Java这个庞大的生态圈和解决方案中,Spring是什么地位?
Spring就是Java开发领域的垄断,因此:不会Spring,不谈就业。
从2002年面市至今,Spring即将走过近20年的历程,它逐步变得愈加强大、几乎已经占据了Java开发领域的垄断地位。
Spring框架的垄断地位,可以从两方面体现出来:
  • 不管你打开哪个公司的Java招聘需求,都会看到Spring是必须掌握的开发框架。这也从侧面证明了:不会Spring,不谈就业。
  • 不管你学习哪个框架,你会发现这个框架总要与Spring整合在一起,这就体现了Spring在Java领域的核心地位。
学习Spring的意义不仅在于开发,Spring作为Java领域占垄断地位的框架,其优秀的设计、值得每个开发者认真揣摩。开发者学习Spring,不仅应该熟练掌握它的用法,更应该从源代码层次认真学习。
不少开发者希望提高自己的架构设计方面的知识,或希望深入学习设计模式,而Spring在这两方面同样也是极好的范例,认真阅读、学习Spring框架的源代码既可提高学习者在架构设计方面的能力,而且Spring源代码在设计模式的应用方面也是教科书级的示范,只要开发者认真理解Spring源代码,自然而然就能掌握这些设计模式。
SSM学到什么程度算真正掌握?

相信现在大家应该已经明白了一个事实:很多人名义上是学习Spring Boot,其实学的是Spring、Spring MVC、MyBatis等框架的内容,这种方式的学习必然是“快餐式”,首先学习所用的资料本身就是残缺的、带有一定误导性的;其实学习者的学习方向也是错误的。

学习Spring Boot就应该重点学习它本身的功能:快速整合自动配置,因此学习Spring Boot应该重点掌握它是如何快速整合Spring及大量三方框架的,并学习Spring Boot自动配置所依赖的具体实现和底层原理,这才是学习Spring Boot的正确姿势,而不是抱着@RestController、@PathVariable、@MatrixVariable等注解瞎搞一通,因为这些东西与Spring Boot并没有太大的关系
可能有初学者会说,可是我还还没有掌握@RestController、@PathVariable、@MatrixVariable等注解的相关知识啊,那么你应该去认真学习IoC、AOP、Spring MVC、MyBatis、Hibernate/JPA等框架(掌握它们的最小交集就是SSM), 而不是指望通过学习Spring Boot掌握它所有能整合的框架。
对于Spring学习而言,重点要掌握的就是IoC和AOP两个核心技术,而这两个核心技术都是由Spring容器表现出来的,因此学习Spring的关键就是尽可能深入地掌握Spring容器和容器中的Bean。
对于一个熟练的Spring使用者而言,他至少要明白Spring容器的本质是什么。
IoC也好,AOP也罢,都只是一个名词,Spring容器的本质无非就是通过XML或注解来驱动底层以反射执行Java代码。因此如果说Spring用得很熟练,至少要完成如下的自由转换:
XML配置(注解) <---->   Java
也就是说:无论你看到什么样的XML配置(或注解),都能迅速知道Spring容器会在底层对应执行怎样的Java代码;反过来,给你任何一段Java代码,你都应该能将它使用XML(或注解)配置出来。达到这个程度之后,Spring才算用得比较熟练,这时再去学习Spring MVC也好、学习Spring Data也好、学习Spring Boot也好、学习Spring Cloud也罢,一般都能迅速明白它们的运行机制,而不是停留在表面的“依葫芦画瓢”。
更进一步,要达到精通Spring的程度,最好的办法还是建议阅读源代码正如前文提到的,Spring框架的源代码在架构设计和设计模式方面都具有极高的可参考性,因此阅读、并理解这些源代码不仅能迅速提高学习者在架构设计方面的能力,也能让开发者真正掌握设计模式在开发中实际应用,而不是停留在背诵设计模式包含哪些组件的层次。
对于MyBatis而言,首先要理解MyBatis的本质是SQL Mapping框架,它并不是真正的ORM框架,因此它的核心就是完成SQL查询和Java对象的映射,因此学习MyBatis的关键就是尽可能全面、深入地掌握SQL查询的各种映射方式。
对于一个熟练的MyBatis使用者而言,他必须能熟练掌握各种查询方式、包括关联查询、子查询、存储过程调用等各种方式的SQL映射。
此外,由于数据库访问是应用性能的关键部分,因此深入学习MyBatis还应该了解各种映射方式可能带来的性能缺陷,掌握在不同场景下使用不同的映射方式,包括如何避免MyBatis在查询过程中产生的“脏数据”。要能通透地掌握这些机制,同样需要学习者对MyBatis部分核心组件的源代码实现,只有当你真正理解了这些源代码实现,才能更好地对MyBatis的数据访问进行针对性的优化。
本文作者李刚,十余年软件开发从业经验,疯狂Java体系原创图书作者。

  • CSDN特邀讲师,在CSDN开设的课程上线迅速销量过万份。
  • 李刚老师亲自培训的学生已在腾讯、阿里、华为、IBM、网易等名企就职。
  • 国内知名高端IT技术图书作家,已出版《疯狂Java讲义》、《疯狂Android讲义》、《轻量级JavaEE企业应用实战》等著作。其中《疯狂Java讲义》销量达几十万册,被北大信科老师实名推荐并先后选作教材及参考书,此书已被翻译成繁体中文版,授权到宝岛台湾。

送书大福利
送书:今天,开源中国 和 博文视点 为大家送上我们李刚老师写的书籍《轻量级JavaEE企业应用实战》 
本书针对Spring MVC、Spring、MyBatis框架核心部分的源代码进行了讲解,不仅能帮助读者真正掌握框架的本质,而且能让读者参考优秀框架的源代码快速提高自己的技术功底。本书介绍的源代码解读方法还可消除开发者对阅读框架源代码的恐惧,让开发者在遇到技术问题时能冷静分析问题,从框架源代码层次找到问题根源。


留言送书活动
活动时间:2020.9.1-2020.9.3
参与方式:本篇文章下留言
1、留言话题:说说你对 SSM 的看法和理解?
2、留言点赞数排名第1,3,5的小伙伴,可以获得由李刚老师写的《轻量级JavaEE企业应用实战》 书籍一本
3、开奖时间:2020.9.3 19:00
觉得不错,请点个在看
继续阅读
阅读原文