摘要:本文結合《Spring源碼深度解析》來分析Spring 5.0.6版本的源代碼。如有描述錯誤之處,歡迎指正。前端
做爲一名開發人員,閱讀源碼是一個很好的學習方式。本文將結合《Spring源碼深度解析》來分析Spring 5.0.6版本的源代碼,如有描述錯誤之處,歡迎指正。web
Spring是2003年興起的一個輕量級Java開源框架,旨在解決企業應用開發的複雜性。Spring發展至今,衍生出很是豐富的模塊,並應用在多種場景,好比:桌面應用,Web應用等。Spring的模塊化能夠容許你只使用須要的模塊,而沒必要所有引入。數據庫
1、總體架構express
1. 核心容器編程
2. 數據訪問/集成數組
3. Web安全
4. AOP服務器
5. Test架構
2、設計理念app
3、使用場景
1. 典型的Spring web應用程序
2. Spring中間層使用第三方web框架
3. 遠程調用
4. EJBs-包裝現存POJOs
Spring框架是一個分層架構,他包含一系列的功能要素,並被分爲大約20個模塊,以下圖所示(很遺憾,並無找到Spring5的架構圖,下圖是Spring4的,但結合Spring5的源碼來看,該圖仍是可以體現Spring5的核心模塊)
這些模塊被總結爲如下幾部分。
Core Container(核心容器)包含有Core、Beans、Context和Expression Language模塊。Core和Beans模塊是框架的基礎部分,提供IoC(控制反轉)和DI(依賴注入)特性。這裏的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程序性單例模式的須要,並真正地容許你從程序邏輯中分離出依賴關係和配置。
Data Access/Integration(數據訪問/集成)層包含有JDBC、ORM、OXM、JMS和Transaction模塊,其中:
Spring框架插入了若干個ORM框架,從而提供了ORM的對象關係工具,其中包括JDO、Hibernate和iBatisSQL Map。全部這些都聽從Spring的通用事務和DAO異常層次結構。
Web上下文模塊創建在應用程序上下文模塊之上,爲基於Web的應用程序提供了上下文。因此Spring框架支持與Jakarta Struts的集成。Web模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工做。Web層包含了Web、Web-Servlet、Web-Struts和Web-Porlet模塊,具體說明以下。
AOP模塊提供了一個符合AOP聯盟標準的面向切面編程的實現,它讓你能夠定義例如方法攔截器和切點。從而將邏輯代碼分開,下降它們之間的耦合性。利用source-level的元數據功能,還能夠將各類行爲信息合併到你的代碼中,這有點像.Net技術中的attribute概念。
經過配置管理特性,SpringAOP模塊直接將面向切面的編程功能集成到了Spring框架中,因此能夠很容易地使Spring框架管理的任何對象支持AOP。Spring AOP模塊爲基於Spring的應用程序中的對象提供了事務管理服務。經過使用Spring AOP,不用依賴EJB組件,就能夠將聲明性事務管理集成到應用程序中。
Test模塊支持使用JUnit和TestNG對Spring組件進行測試。
Spring是面向Bean的編程(BOP:Bean Oriented Programming),Bean在Spring中才是真正的主角。Bean在Spring中做用就像Object對OOP的意義同樣,沒有對象的概念就像沒有面向對象編程,Spring中沒有Bean也就沒有Spring存在的意義。Spring提供了IoC 容器經過配置文件或者註解的方式來管理對象之間的依賴關係。
控制反轉(Inversion of Control,縮寫爲IoC),是面向對象編程中的一種設計原則,能夠用來減低計算機代碼之間的耦合度。其中最多見的方式叫作依賴注入(Dependency Injection,簡稱DI),還有一種方式叫「依賴查找」(Dependency Lookup)。經過控制反轉,對象在被建立的時候,由一個調控系統內全部對象的外界實體,將其所依賴的對象的引用傳遞給它。也能夠說,依賴被注入到對象中。前面描述的模塊使得Spring成爲許多場景中的合理選擇,從在資源受限設備上運行的嵌入式應用程序到使用Spring事務管理功能和Web框架集成的全面的企業應用程序。
有時狀況並不容許你徹底切換到一個不一樣的框架。Spring框架不是一個要麼使用所有特性要麼什麼都用不了的解決方案,不強制使用其中的每一個功能。現存的前端如Struts,Tapestry,JSF或其餘UI框架均可以同基於Spring的中間層整合在一塊兒,從而使你可以使用Spring事務功能。你只須要使用ApplicationContext鏈接你的業務邏輯以及經過WebApplicationContext整合你的web層。
你可使用Spring的Hessian-,Rmi-或HttpInvokerProxyFactoryBean類來經過web服務訪問現存的代碼。遠程訪問現存應用程序並不困難。
Spring框架還爲企業JavaBeans提供了一個訪問抽象層,使你可以重用現有的POJO,並將其包裝在無狀態會話bean中,以便在可能須要聲名式安全的可擴展,故障安全的web應用程序中使用。