一篇告訴你什麼是Spring

閱讀全文大概須要7分鐘java

前言

大多數文章講"什麼到Spring?"上來就是 控制反轉(IoC)或依賴注入(DI)和麪向切面編程(AOP),拿着官網文檔直譯 copy。對小白來講並不友好,看完可能仍是一頭霧水。下面是我利用業餘時間整理的一些資料、書籍和本身的理解,致力於更容易理解方式講 Spring。

[toc]web

什麼是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(一站式) 輕量級開源框架。spring

簡單來講,它是一個容器框架,用來裝 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 創造出的對象都是空值是沒法使用的,因此說 IoCDI 多數是同時出現人們眼前的。

IOCInversion 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 的話,你只須要配置好,而後在須要的地方引用就好了,這大大增長了項目的可維護性且下降了開發難度。

推薦閱讀:

https://www.zhihu.com/questio...

IoC容器的初始化過程能夠分爲三步:

  1. Resource 定位(Bean的定義文件定位)、
  2. 將 Resource 定位好的資源載入到 BeanDefinition、
  3. 將 BeanDefiniton 註冊到容器中

IoC 源碼:

https://javadoop.com/post/spr...

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 來實現動態代理。

推薦閱讀:https://www.jianshu.com/p/5b9...

固然,也可使用 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 存在線程安全問題,當多個線程操做同一個對象的時候,這個對象的非靜態成員變量會存在線程安全問題。

解決方法:

  1. 在類中定義一個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 事務聲明

事務管理對於企業應用來講是相當重要的,即便出現異常狀況,它也能夠保證數據的一致性。
  1. 編程式事務,在代碼中硬編碼。(不推薦使用)
  2. 聲明式事務,在配置文件中配置(推薦使用)

聲明式事務又分爲兩種:

  1. 基於XML的聲明式事務
  2. 基於註解的聲明式事務

比較重要的一點是

@Transactional(rollbackFor = Exception.class)註解

@Transactional 註解中若是不配置 rollbackFor 屬性,那麼事物只會在遇到 RuntimeException 的時候纔會回滾,加上 rollbackFor=Exception.class ,可讓事物在遇到非運行時異常時也回滾。

後記

scope 是範圍的意思,在絕地求生中 scope 意爲瞄準鏡,若是你的隊友是個老外你就和他說 i want this 4times scope 他就明白了。

下篇結合代碼一塊講解

聲明:參考來源互聯網,有任何爭議能夠留言。站在前人的肩上,咱們才能看的更遠。

本教程純手打,致力於最實用教程,但願多多轉發支持,對我真的很重要。
歡迎來我公衆號,但願能夠結識你,更多原創PDF,微信搜索:JavaPub,回覆:【666】,也能夠催更。

有任何問題均可以來談談 !