前言
現在Spring幾乎成為了Java在企業級復雜應用開發的代名詞,得益於Spring簡單的設計哲學和其完善的生態圈,確實為廉頗老矣,尚能飯否的 Java 帶來了“春天”,有很多同學剛接觸Java就直接從Spring框架開始學習,導致產生了很多疑惑,甚至有很多同學只知道用Spring,並不了解其中的原理,例如:
- Spring框架為我們做了什么,沒有Spring框架前我們的程序是什么樣的?
- 為什么要把對象放在Spring容器里面,為什么我不能直接new對象?
- 為什么要把Sevlet交給Spring MVC管理,我自己寫Sevlet處理HTTP請求不行嗎?
- Spring為什么要封裝這么多的 Template(JDBCTemplate,RestTemplate等……)它想要干什么?
Spring 生態遍地開發(SpringBoot,SpringCloud 等等),本篇文章不會深入探討Spring 每個框架的實現細節,只會大概講Spring Framework背后的設計理念和它為我們所做的事情,讓大家知其然並知其所以然,可以在用 Spring 的時候能知悉底層和內部細節發生的事情,如果是對於 Spring Frameword 和其生態框架的細節有興趣的同學可以在詳盡的閱讀官方的文檔,https://spring.io/projects(這應該是我見過寫的最好的技術文檔之一)
Spring 為我們做了哪些事情?
Spring 全家桶框架眾多,但主要的設計原則簡單來說,離不開這幾點:
- 通過代碼解耦,提高代碼靈活性(依賴注入 DI)
- 簡化開發,用最少的代碼,做最多的事情(AOP,Template)
- 提供公共抽象,屏蔽底層,開箱即用,替換方便(Spring Cache,框架,中間件集成)
- MVC模型的快速實現(視圖解析,數據轉換)
下面拆開來說說這幾點,為我們帶來什么好處,最后探討下,如果沒有 Spring 用原生的 J2EE 我們的程序會變成什么樣
先說說 Spring Framework 的核心功能,DI 依賴注入,AOP 面向切面編程
依賴注入也叫 IOC 控制反轉,依賴注入是編程大師 Martin Fowler 提出來的,我個人比較喜歡依賴注入這個名詞,感覺比控制反轉更具有表達性,也更容易理解
那么依賴注入為我們做了什么 ?
- 靈活:依提供的面向接口的編程方法,為類和類之間建立更靈活的關系
- 解耦:移除了直接在程序中 new 實例的高耦合做法
- 方便:要替換類的實現,只需要在 Spring 容器中更換聲明,無需改動代碼
那么 AOP 面向切面又為我們做了什么?
- 消除重復的模板代碼(性能監控,異常封裝,參數跟蹤等……)
- 更代碼結構更加整潔,通用的邏輯基本都可以用 AOP 來處理
- Spring 的聲明式事務就是 Spring AOP 的優秀實現案例
還為我們做了什么其他的事情?
- Spring JdbcTemplate 消除了JDBC API令人詬病的模板代碼
- Spring Cache 提供緩存功能,並且無需關心底層緩存組件細節(Ehcache,Guava,JSR-107 Cache等……)
- Spring DAO 提供連接池功能,並且無需關心底層連接池組件細節(C3P0,DBCP等……)
- 提供 定時任務功能 集成(Quartz,JDK Timer,Executor)
- 整合ORM框架,測試框架集成
- 快速實現MVC模型,並且集成Sring,數據處理,視圖解析等都由Spring處理
以上等等功能,都是 Spring 框架為我們做處理的事情
當然 Spring 生態里還有非常多的框架來簡化我們的日常開發,提高開發效率,常用的例如:
- Spring Boot (無需配置,快速開發,啟動,集成生產級的監控指標)
- Spring Cloud(快速實現微服務的框架,提供系列微服務的組件框架)
- Spring Shrio(基於角色資源的安全框架,利用AOP實現鑒權等安全訪問的功能)
- Spring Data(提供數據訪問實現,包括非關系數據庫,關系數據庫,雲數據服務等)
假如沒有 Spring ?
讓我們想象一下,假如沒有 Spring,我們在做企業級應用開發會大概會發生什么事情?
- 類和類之間通過 new 建立關系,充滿耦合,小處改動都要修改大量代碼
- 充滿和業務無關的模板代碼,10行代碼可能只有1行是業務邏輯
- 大量的事務,異常,JDBC的模板處理代碼,不僅代碼極度脆弱,容易出錯,而且可讀性極差,基本不可維護
- 你要為每個請求寫一個 Servlet 處理,並且自己處理 request/response,Servlet 也充斥着大量重復的模板代碼
- 你項目的代碼量可能會比現在多很多
以上,你是如何看待 Spring 帶來的復雜性和提供的便利性?現在 Spring 體系也越來越龐大,貌似與它剛開始對抗 EJB 的時候所提出的輕量級,簡單的設計原則開始背道而馳,關於這點你又是怎么評價呢?個人知識有限,不喜勿噴,歡迎發表評論和分享你的觀點和看法。