01丨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等框架,因為它們才是真正干活的框架。
02丨不會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源代碼,自然而然就能掌握這些設計模式。
03丨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的數據訪問進行針對性的優化。