引入控制反轉概念
將物件的建立權/管理權交出去了,不再使用硬編碼的方式了。同時也把物件關係的管理權交出去了,也不再使用硬編碼的方式了。像這種把物件的建立權交出去,把物件關係的管理權交出去,被稱為控制反轉。
控制反轉IoC
控制反轉(Inversion of Control,縮寫為IoC),是物件導向程式設計中的一種設計思想,可以用來降低程式碼之間的耦合度,符合依賴倒置原則。IoC可以認為是一種全新的設計模式,但是理論和時間成熟相對較晚,並沒有包含在GoF中。(GoF指的是23種設計模式)。Spring框架就是一個實現了IoC思想的框架。
控制反轉思想的核心是:將物件的建立權交出去,將物件和物件之間關係的管理權交出去,由第三方容器來負責建立與維護。
控制反轉常見的實現方式:依賴注入(Dependency Injection,簡稱DI)。通常,依賴注入的實現又包括兩種方式:
- set方法注入
- 構造方法注入
Spring概述
Spring簡介
Spring是一個開源框架,它由Rod Johnson建立。它是為了解決企業應用開發的複雜性而建立的。
從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。
Spring是一個輕量級的控制反轉(IoC)和麵向切面(AOP)的容器框架。
Spring最初的出現是為了解決EJB臃腫的設計,以及難以測試等問題。
Spring為簡化開發而生,讓程式設計師只需關注核心業務(這裡主要透過AOP)的實現,儘可能的不再關注非業務邏輯程式碼(事務控制,安全日誌等)。
Spring 8大模組
注意:Spring5版本之後是8個模組。在Spring5中新增了WebFlux模組。
- Spring Core模組
這是Spring框架最基礎的部分,它提供了依賴注入(DependencyInjection)特徵來實現容器對Bean的管理。核心容器的主要元件是 BeanFactory,BeanFactory是工廠模式的一個實現,是任何Spring應用的核心。它使用IoC將應用配置和依賴從實際的應用程式碼中分離出來。
- Spring Context模組
如果說核心模組中的BeanFactory使Spring成為容器的話,那麼上下文模組就是Spring成為框架的原因。
這個模組擴充套件了BeanFactory,增加了對國際化(I18N)訊息、事件傳播、驗證的支援。另外提供了許多企業服務,例如電子郵件、JNDI訪問、EJB整合、遠端以及時序排程(scheduling)服務。也包括了對模版框架例如Velocity和FreeMarker整合的支援
- Spring AOP模組
Spring在它的AOP模組中提供了對面向切面程式設計的豐富支援,Spring AOP 模組為基於 Spring 的應用程式中的物件提供了事務管理服務。透過使用 Spring AOP,不用依賴元件,就可以將宣告性事務管理整合到應用程式中,可以自定義攔截器、切點、日誌等操作。
- Spring DAO模組
提供了一個JDBC的抽象層和異常層次結構,消除了煩瑣的JDBC編碼和資料庫廠商特有的錯誤程式碼解析,用於簡化JDBC。
- Spring ORM模組
Spring提供了ORM模組。Spring並不試圖實現它自己的ORM解決方案,而是為幾種流行的ORM框架提供了整合方案,包括Hibernate、JDO和iBATIS SQL對映,這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
- Spring Web MVC模組
Spring為構建Web應用提供了一個功能全面的MVC框架。雖然Spring可以很容易地與其它MVC框架整合,例如Struts,但Spring的MVC框架使用IoC對控制邏輯和業務物件提供了完全的分離。
- Spring WebFlux模組
Spring Framework 中包含的原始 Web 框架 Spring Web MVC 是專門為 Servlet API 和 Servlet 容器構建的。反應式堆疊 Web 框架 Spring WebFlux 是在 5.0 版的後期新增的。它是完全非阻塞的,支援反應式流(Reactive Stream)背壓,並在Netty,Undertow和Servlet 3.1+容器等伺服器上執行。
- Spring Web模組
Web 上下文模組建立在應用程式上下文模組之上,為基於 Web 的應用程式提供了上下文,提供了Spring和其它Web框架的整合,比如Struts、WebWork。還提供了一些面向服務支援,例如:實現檔案上傳的multipart請求。
Spring特點
- 輕量
- 從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小隻有1MB多的JAR檔案裡釋出。並且Spring所需的處理開銷也是微不足道的。
- Spring是非侵入式的:Spring應用中的物件不依賴於Spring的特定類。
- 控制反轉
- Spring透過一種稱作控制反轉(IoC)的技術促進了松耦合。當應用了IoC,一個物件依賴的其它物件會透過被動的方式傳遞進來,而不是這個物件自己建立或者查詢依賴物件。你可以認為IoC與JNDI相反——不是物件從容器中查詢依賴,而是容器在物件初始化時不等物件請求就主動將依賴傳遞給它。
- 面向切面
- Spring提供了面向切面程式設計的豐富支援,允許透過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。應用物件只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支援。
- 容器
- Spring包含並管理應用物件的配置和生命週期,在這個意義上它是一種容器,你可以配置你的每個bean如何被建立——基於一個可配置原型(prototype),你的bean可以建立一個單獨的例項或者每次需要時都生成一個新的例項——以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。
- 框架
- Spring可以將簡單的元件配置、組合成為複雜的應用。在Spring中,應用物件被宣告式地組合,典型地是在一個XML檔案裡。Spring也提供了很多基礎功能(事務管理、持久化框架整合等等),將應用邏輯的開發留給了你。
所有Spring的這些特徵使你能夠編寫更乾淨、更可管理、並且更易於測試的程式碼。它們也為Spring中的各種模組提供了基礎支援。