一篇告訴你什麼是Spring
閱讀全文大概需要7分鐘
前言
大多數文章講"什麼到Spring?"上來就是 控制反轉(IoC)或依賴注入(DI)和麵向切面程式設計(AOP),拿著官網文件直譯 copy。對小白來說並不友好,看完可能還是一頭霧水。下面是我利用業餘時間整理的一些資料、書籍和自己的理解,致力於更容易理解方式講 Spring。
什麼是Spring ?
Spring 是一個開源框架,Spring是於2003 年興起的一個 輕量級的Java 開發框架,由 Rod Johnson 在其著作 Expert One-On-One J2EE Development and Design 中闡述的部分理念和原型衍生而來。它是為了解決企業應用開發的複雜性而建立的。框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使用哪一個元件,同時為 J2EE 應用程式開發提供整合的框架。Spring 使用基本的 JavaBean 來完成以前只可能由 EJB 完成的事情。
然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。
Spring的核心是控制反轉(IoC)和麵向切面(AOP)。簡單來說,Spring 是一個分層的
JavaSE/EE full-stack
(一站式)
輕量級
開源框架。
簡單來說,它是一個容器框架,用來裝 javabean(java物件),中間層框架(萬能膠)可以起一個連線作用,比如說把 Struts 和 hibernate 粘合在一起運用。簡單來說,Spring 是一個輕量級的控制反轉(IoC)和麵向切面(AOP)的容器框架。
如果你現在還有點疑惑,通讀全文,你一定有所收穫
Spring 模組
以下內容都是基於 Spring 4 及以上的
Spring
官網圖片
-
Spring Core:Spring核心模組,主要提供 ioC 依賴注入、 -
Spring Context:向Spring框架提供上下文資訊、 -
Spring AOP:面向切面程式設計,為基於 Spring 的應用程式中的物件提供了事務管理服務、 -
Spring JDBC:Java資料庫連線、 -
Spring JMS:Java訊息服務、 -
Spring ORM:用於支援 MyBatis、Hibernate 等 ORM 工具、 -
Spring Web:為建立Web應用程式提供支援、 -
Spring Test:提供了對 JUnit 和 TestNG 測試的支援、 -
Spring Aspects:該模組為與AspectJ的整合提供支援。 -
Spring Web:Spring框架支援與Struts整合,為基於web的應用程式提供了上下文。
Spring的優點
-
方便解耦,簡化開發 (高內聚低耦合)
Spring就是一個大工廠(容器),可以將所有物件建立和依賴關係維護,交給Spring管理,spring工廠是用於生成bean
-
AOP程式設計的支援
Spring提供面向切面程式設計,可以方便的實現對程式進行許可權攔截、執行監控等功能
-
宣告式事務的支援
只需要透過配置就可以完成對事務的管理,而無需手動程式設計
-
方便程式的測試
Spring對Junit4支援,可以透過註解方便的測試Spring程式
-
方便整合各種優秀框架
Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支援
-
降低JavaEE API的使用難度
Spring 對 JavaEE 開發中非常難用的一些 API(JDBC、JavaMail、遠端呼叫等),都提供了封裝,使這些 API 應用難度大大降低
我對 Spring IoC 和 AOP 理解
Spring 中最重要的概念 IoC 和 AOP
IoC(Inversion of Control)控制反轉
IoC
需要DI
(依賴注入)的支援為什麼呢?因為沒有 DI 的注入 Spring 創造出的物件都是空值是無法使用的,所以說IoC
和DI
多數是同時出現人們眼前的。
IOC
是
Inversion of Control
的縮寫,多數書籍翻譯成“控制反轉”。
為了解決物件之間的耦合度過高的問題,軟體專家 Michael Mattson 提出了 IOC 理論,用來實現物件之間的
解耦。
2004年,Martin Fowler探討了同一個問題,既然IOC是控制反轉,那麼到底是“哪些方面的控制被反轉了呢?”,經過詳細地分析和論證後,他得出了答案:“獲得依賴物件的過程被反轉了”。控制被反轉之後,獲得依賴物件的過程由自身管理變為了由 IOC 容器主動注入。於是,他給“控制反轉”取了一個更合適的名字叫做“依賴注入(Dependency Injection)”。他的這個答案,實際上給出了實現 IOC 的方法:注入。所謂依賴注入,就是由IOC容器在執行期間,動態地將某種依賴關係注入到物件之中。
依賴注入(DI)和控制反轉(IOC)是從不同的角度的描述的同一件事情,就是指 透過引入 IOC 容器,利用依賴關係注入的方式,實現物件之間的解耦。
背景介紹完了,講講我的理解
IoC 就是 依賴倒置原則的一種 設計思路,就 是將原本在程式中自己手動建立物件的控制權,交由 Spring 框架來管理。Spring 框架負責控制物件的 生命週期和 物件之間的關係。IoC 在其他語言中也有應用,並非 Spirng 特有。 ioc 容器實際上就是個 map(key,value),裡面存的是各種物件(在xml裡配置的bean節點||repository、service、controller、component)。
Spring IOC 容器就像是一個工廠一樣,當我們需要建立一個物件的時候,只需要配置好配置檔案/註解即可,完全不用考慮物件是如何被建立出來的。 IOC 容器負責建立物件,將物件連線在一起,配置這些物件,並從建立中處理這些物件的整個生命週期,直到它們被完全銷燬。
在實際專案中一個 Service 類如果有幾百甚至上千個類作為它的底層,我們需要例項化這個 Service,你可能要每次都要搞清這個 Service 所有底層類的建構函式,這可能會把人逼瘋。如果利用 IOC 的話,你只需要配置好,然後在需要的地方引用就行了,這大大增加了專案的可維護性且降低了開發難度。
推薦閱讀:
IoC容器的初始化過程可以分為三步:
-
Resource 定位(Bean的定義檔案定位)、 -
將 Resource 定位好的資源載入到 BeanDefinition、 -
將 BeanDefiniton 註冊到容器中
IoC 原始碼:
AOP(Aspect-OrientedProgramming)面向切面程式設計
什麼是 AOP?
AOP(Aspect Oriented Programming 面向切面程式設計),在程式開發中主要用來解決一些系統層面上的問題,比如 日誌收集,事務管理,許可權,快取,物件池管理等。
AOP 可以說是 OOP(Object Oriented Programming,物件導向程式設計)的補充和完善。OOP 引入封裝、繼承、多型等概念來建立一種物件層次結構,用於模擬公共行為的一個集合。不過 OOP 允許開發者定義縱向的關係,但並不適合定義橫向的關係,例如日誌功能。日誌程式碼往往橫向地散佈在所有物件層次中,而與它對應的物件的核心功能毫無關係對於其他型別的程式碼,如 安全性、異常處理和透明的持續性也都是如此,這種散佈在各處的無關的程式碼被稱為橫切(cross cutting),在 OOP 設計中,它導致了 大量程式碼的重複,而不利於各個模組的重用。
AOP技術恰恰相反,它利用一種稱為"橫切"的技術,剖解開封裝的物件內部,並將那些影響了多個類的公共行為封裝到一個可重用模組,並將其命名為"Aspect",即切面。所謂"切面",簡單說就是那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任封裝起來, 便於減少系統的重複程式碼,降低模組之間的耦合度,並有 利於未來的可操作性和可維護性。
Spring AOP
Spring AOP就是基於動態代理的,底層實現有倆種方式:一種是 JDK 動態代理(JDK Proxy),另一種是 CGLib(Code Generation Library(基於位元組碼操作)) 的方式。
如果要被代理的物件是個實現類,那麼 Spring 會使用 JDK動態代理來完成操作(Spirng 預設採用JDK動態代理實現機制);如果要被代理的物件不是個實現類那麼,Spring 會強制使用 CGLib 來實現動態代理。
推薦閱讀:
當然,也可以使用 AspectJ ,AspectJ 可以做Spring AOP幹不了的事情,它是 AOP 程式設計的完全解決方案。
Spring AOP 和 AspectJ AOP 有什麼區別?
Spring AOP 屬於執行時增強;而 AspectJ 是編譯時增強。Spring AOP 只能在執行時織入,AspectJ 執行時織入不可用,支援編譯時、編譯後和載入時織入。
AspectJ 相比於 Spring AOP 功能更加強大,但是 Spring AOP 相對來說更簡單。
Spring 的 bean
bean 的作用域有哪些 ?
Spring bean 單例與執行緒安全問題
執行緒安全一直是程式碼編寫的重地,我們大多時候在系統開發中不會使用多執行緒。單例 bean 存線上程安全問題,當多個執行緒操作同一個物件的時候,這個物件的非靜態成員變數會存線上程安全問題。
解決方法:
-
在類中定義一個ThreadLocal成員變數,將需要的可變成員變數儲存在 ThreadLocal 中(推薦的一種方式,這也是常用一種);
2.在Bean物件中儘量避免定義可變的成員變數。
Spring bean 的生命週期
在傳統的Java應用中,bean的生命週期很簡單,使用Java關鍵字 new 進行Bean 的例項化,然後該Bean 就能夠使用了。一旦bean不再被使用,則由Java自動進行垃圾回收。
相比之下,Spring管理Bean的生命週期就複雜多了,正確理解Bean 的生命週期非常重要。一個Bean的構造過程:
談談對 Spring MVC 的理解
說到了 Spring ,那一定提一下 Spring MVC,各種講 SSM 的技術部落格大家應該都見了很多。
在我初學時 Java,那時講的是 “Java Bean(Model) + JSP(View) + Servlet(Controller)” 這種開發模式,這是早期的 JavaWeb MVC。
Spring MVC 是一款很優秀的 MVC 框架。可以讓我們的開發更簡潔,而且它和 Spring 是無縫整合,是 Spring 的一個子模組,是我們上面提到 Spring 大家族中 Web 模組。
Spring MVC 框架主要由 DispatcherServlet 、處理器對映、處理器(控制器)、檢視解析器、檢視組成。
Spring MVC 流程圖很重要:
Spring 事務宣告
事務管理對於企業應用來說是至關重要的,即使出現異常情況,它也可以保證資料的一致性。
-
程式設計式事務,在程式碼中硬編碼。(不推薦使用) -
宣告式事務,在配置檔案中配置(推薦使用)
宣告式事務又分為兩種:
-
基於XML的宣告式事務 -
基於註解的宣告式事務
比較重要的一點是
@Transactional(rollbackFor = Exception.class)註解
在
@Transactional
註解中如果不配置
rollbackFor
屬性,那麼事物只會在遇到
RuntimeException
的時候才會回滾,加上
rollbackFor=Exception.class
,可以讓事物在遇到非執行時異常時也回滾。
後記
scope 是範圍的意思,在絕地求生中 scope 意為瞄準鏡,如果你的隊友是個老外你就和他說 i want this 4times scope 他就明白了。
下篇結合程式碼一塊講解
宣告:參考來源網際網路,有任何爭議可以留言。站在前人的肩上,我們才能看的更遠。
本教程純手打,致力於最實用教程,希望多多轉發支援,對我真的很重要。 歡迎來我公眾號,希望可以結識你,更多原創PDF,微信搜尋:JavaPub,回覆:【666】,也可以催更。
有任何問題都可以來談談 !
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69977829/viewspace-2702470/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一篇故事告訴你什麼是微服務架構!微服務架構
- 告訴你什麼是Pixelmator Pro for Mac!Mac
- 一張圖告訴你什麼是GraphQL?
- 【轉】kafka-告訴你什麼是kafkaKafka
- 用大白話告訴你什麼是Event LoopOOP
- 告訴你什麼是TestOps測試運維運維
- 一座島告訴你,什麼是智慧!
- Java,你告訴我 fail-fast 是什麼鬼?JavaAIAST
- 用大白話告訴你,Java到底是什麼Java
- 一文告訴你什麼是NAT,為什麼需要NAT
- 用最簡單的話告訴你什麼是ElasticSearchElasticsearch
- 一文告訴你大資料是什麼大資料
- 銷冠AI教練告訴你什麼是智慧坐席助手AI
- 讓 APISpace 告訴你什麼場景使用什麼APIAPI
- 今天是霧霾,明天是什麼?馬爾可夫鏈告訴你馬爾可夫
- 單碟片面密度3TB+是什麼水平?希捷告訴你希捷
- 用大白話告訴你 :Java 後端到底是在做什麼?Java後端
- NuoDB:告訴你未來的資料庫是什麼樣VU資料庫
- 什麼是雲資料庫?這篇文章詳細告訴你!資料庫
- 爆肝30小時後,我想告訴你《原神》是什麼
- 大資料最核心的價值是什麼?三點告訴你!大資料
- 碼教授告訴你什麼事人工智慧人工智慧
- 元宇宙是什麼?一文告訴你元宇宙需要什麼技術支撐元宇宙
- 通俗易懂,一篇文章告訴你程式語言是個啥?
- 馬爾可夫鏈是個什麼鬼?圖文詳解告訴你!馬爾可夫
- 什麼是「小島秀夫遊戲」?讓監督親自告訴你遊戲
- 什麼是智慧數字經營系統?這三點告訴你答案
- 讓機器學習告訴你,你的siri在想什麼!機器學習
- 告訴你MySQL主鍵查詢為什麼這麼快MySql
- 一句話告訴別人什麼是CNNCNN
- BI小白不能錯過|一文告訴你什麼是商務智慧
- 十名遊戲開發者告訴你什麼是「手繪遊戲」遊戲開發
- 自考畢業證丟了?一篇文章告訴你怎麼補辦!
- 今天穿什麼?阿里AI小助手——滴搭告訴你!阿里AI
- 碼教授告訴你大資料具體指的是什麼?大資料
- 我試圖透過這篇文章告訴你,什麼是神奇的泛化呼叫。
- [AI開發]零數學公式告訴你什麼是(卷積)神經網路AI公式卷積神經網路
- VS 2019 打包安裝檔案 教程 (告訴你為什麼你的是DLL檔案)解決!