為什么你要用 Spring?


前言

現在Spring幾乎成為了Java在企業級復雜應用開發的代名詞,得益於Spring簡單的設計哲學和其完善的生態圈,確實為廉頗老矣,尚能飯否的 Java 帶來了“春天”,有很多同學剛接觸Java就直接從Spring框架開始學習,導致產生了很多疑惑,甚至有很多同學只知道用Spring,並不了解其中的原理,例如:

  1. Spring框架為我們做了什么,沒有Spring框架前我們的程序是什么樣的?
  2. 為什么要把對象放在Spring容器里面,為什么我不能直接new對象?
  3. 為什么要把Sevlet交給Spring MVC管理,我自己寫Sevlet處理HTTP請求不行嗎?
  4. 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 的時候所提出的輕量級,簡單的設計原則開始背道而馳,關於這點你又是怎么評價呢?個人知識有限,不喜勿噴,歡迎發表評論和分享你的觀點和看法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM