Spring原始碼剖析開篇:什麼是Spring?
<!-- more -->
在講原始碼之前,先讓我們回顧一下一下Spring的基本概念,當然,在看原始碼之前你需要使用過spring或者spirngmvc。
Spring是什麼
Spring是一個開源的輕量級Java SE(Java 標準版本)/Java EE(Java 企業版本)開發應用框架,其目的是用於簡化企業級應用程式開發。應用程式是由一組相互協作的物件組成。而在傳統應用程式開發中,一個完整的應用是由一組相互協作的物件組成。所以開發一個應用除了要開發業務邏輯之外,最多的是關注如何使這些物件協作來完成所需功能,而且要低耦合、高內聚。業務邏輯開發是不可避免的,那如果有個框架出來幫我們來建立物件及管理這些物件之間的依賴關係。可能有人說了,比如“抽象工廠、工廠方法 設計模式 ”不也可以幫我們建立物件,“生成器模式”幫我們處理物件間的依賴關係,不也能完成這些功能嗎?可是這些又需要我們建立另一些工廠類、生成器類,我們又要而外管理這些類,增加了我們的負擔,如果能有種透過配置方式來建立物件,管理物件之間依賴關係,我們不需要透過工廠和生成器來建立及管理物件之間的依賴關係,這樣我們是不是減少了許多工作,加速了開發,能節省出很多時間來幹其他事。Spring框架剛出來時主要就是來完成這個功能。
Spring框架除了幫我們管理物件及其依賴關係,還提供像通用日誌記錄、效能統計、安全控制、異常處理等面向切面的能力,還能幫我管理最頭疼的資料庫事務,本身提供了一套簡單的JDBC訪問實現,提供與第三方資料訪問框架整合(如Hibernate、JPA),與各種Java EE技術整合(如Java Mail、任務排程等等),提供一套自己的web層框架Spring MVC、而且還能非常簡單的與第三方web框架整合。從這裡我們可以認為Spring是一個超級粘合平臺,除了自己提供功能外,還提供粘合其他技術和框架的能力,從而使我們可以更自由的選擇到底使用什麼技術進行開發。而且不管是JAVA SE(C/S架構)應用程式還是JAVA EE(B/S架構)應用程式都可以使用這個平臺進行開發。讓我們來深入看一下Spring到底能幫我們做些什麼?
Spring能幫我們做什麼
Spring除了不能幫我們寫業務邏輯,其餘的幾乎什麼都能幫助我們簡化開發:
一、傳統程式開發,建立物件及組裝物件間依賴關係由我們在程式內部進行控制,這樣會加大各個物件間的耦合,如果我們要修改物件間的依賴關係就必須修改原始碼,重新編譯、部署;而如果採用Spring,則由Spring根據配置檔案來進行建立及組裝物件間依賴關係,只需要改配置檔案即可,無需重新編譯。所以,Spring能幫我們根據配置檔案建立及組裝物件之間的依賴關係。
二、當我們要進行一些日誌記錄、許可權控制、效能統計等時,在傳統應用程式當中我們可能在需要的物件或方法中進行,而且比如許可權控制、效能統計大部分是重複的,這樣程式碼中就存在大量重複程式碼,即使有人說我把通用部分提取出來,那必然存在呼叫還是存在重複,像效能統計我們可能只是在必要時才進行,在診斷完畢後要刪除這些程式碼;還有日誌記錄,比如記錄一些方法訪問日誌、資料訪問日誌等等,這些都會滲透到各個要訪問方法中;還有許可權控制,必須在方法執行開始進行稽核,想想這些是多麼可怕而且是多麼無聊的工作。如果採用Spring,這些日誌記錄、許可權控制、效能統計從業務邏輯中分離出來,透過Spring支援的面向切面程式設計,在需要這些功能的地方動態新增這些功能,無需滲透到各個需要的方法或物件中;有人可能說了,我們可以使用“代理設計模式”或“包裝器設計模式”,你可以使用這些,但還是需要透過程式設計方式來建立代理物件,還是要耦合這些代理物件,而採用Spring 面向切面程式設計能提供一種更好的方式來完成上述功能,一般透過配置方式,而且不需要在現有程式碼中新增任何額外程式碼,現有程式碼專注業務邏輯。所以,Spring 面向切面程式設計能幫助我們無耦合的實現日誌記錄,效能統計,安全控制。
三、在傳統應用程式當中,我們如何來完成資料庫事務管理?需要一系列“獲取連線,執行SQL,提交或回滾事務,關閉連線”,而且還要保證在最後一定要關閉連線,多麼可怕的事情,而且也很無聊;如果採用Spring,我們只需獲取連線,執行SQL,其他的都交給Spring來管理了,簡單吧。所以,Spring能非常簡單的幫我們管理資料庫事務。
四、Spring還提供了與第三方資料訪問框架(如Hibernate、JPA)無縫整合,而且自己也提供了一套JDBC訪問模板,來方便資料庫訪問。
五、Spring還提供與第三方Web(如Struts、JSF)框架無縫整合,而且自己也提供了一套Spring MVC框架,來方便web層搭建。
六、Spring能方便的與Java EE(如Java Mail、任務排程)整合,與更多技術整合(比如快取框架)。
Spring能幫我們做這麼多事情,提供這麼多功能和與那麼多主流技術整合,而且是幫我們做了開發中比較頭疼和困難的事情,那可能有人會問,難道只有Spring這一個框架,沒有其他選擇?當然有,比如EJB需要依賴應用伺服器、開發效率低、在開發中小型專案是宰雞拿牛刀,雖然發展到現在EJB比較好用了,但還是比較笨重還需要依賴應用伺服器等。那為何需要使用Spring,而不是其他框架呢?讓我們接著往下看。
為何需要Spring
一 首先闡述幾個概念
1、應用程式:是能完成我們所需要功能的成品,比如購物網站、OA系統。
2、框架:是能完成一定功能的半成品,比如我們可以使用框架進行購物網站開發;框架做一部分功能,我們自己做一部分功能,這樣應用程式就建立出來了。而且框架規定了你在開發應用程式時的整體架構,提供了一些基礎功能,還規定了類和物件的如何建立、如何協作等,從而簡化我們開發,讓我們專注於業務邏輯開發。
3、非侵入式設計:從框架角度可以這樣理解,無需繼承框架提供的類,這種設計就可以看作是非侵入式設計,如果繼承了這些框架類,就是侵入設計,如果以後想更換框架之前寫過的程式碼幾乎無法重用,如果非侵入式設計則之前寫過的程式碼仍然可以繼續使用。
4、輕量級及重量級:輕量級是相對於重量級而言的,輕量級一般就是非入侵性的、所依賴的東西非常少、資源佔用非常少、部署簡單等等,其實就是比較容易使用,而重量級正好相反。
5、POJO:POJO(Plain Old Java Objects)簡單的Java物件,它可以包含業務邏輯或持久化邏輯,但不擔當任何特殊角色且不繼承或不實現任何其它Java框架的類或介面。
6、容器:在日常生活中容器就是一種盛放東西的器具,從程式設計角度看就是裝物件的的物件,因為存在放入、拿出等操作,所以容器還要管理物件的生命週期。
7、控制反轉:即Inversion of Control,縮寫為IoC,控制反轉還有一個名字叫做依賴注入(Dependency Injection),就是由容器控制程式之間的關係,而非傳統實現中,由程式程式碼直接操控。
8、Bean:一般指容器管理物件,在Spring中指Spring IoC容器管理物件。
二 為什麼需要Spring及Spring的優點
●非常輕量級的容器:以集中的、自動化的方式進行應用程式物件建立和裝配,負責物件建立和裝配,管理物件生命週期,能組合成複雜的應用程式。Spring容器是非侵入式的(不需要依賴任何Spring特定類),而且完全採用POJOs進行開發,使應用程式更容易測試、更容易管理。而且核心JAR包非常小,Spring3.0.5不到1M,而且不需要依賴任何應用伺服器,可以部署在任何環境(Java SE或Java EE)。
●AOP:AOP是Aspect Oriented Programming的縮寫,意思是面向切面程式設計,提供從另一個角度來考慮程式結構以完善物件導向程式設計(相對於OOP),即可以透過在編譯期間、裝載期間或執行期間實現在不修改原始碼的情況下給程式動態新增功能的一種技術。通俗點說就是把可重用的功能提取出來,然後將這些通用功能在合適的時候織入到應用程式中;比如安全,日記記錄,這些都是通用的功能,我們可以把它們提取出來,然後在程式執行的合適地方織入這些程式碼並執行它們,從而完成需要的功能並複用了這些功能。
● 簡單的資料庫事務管理:在使用資料庫的應用程式當中,自己管理資料庫事務是一項很讓人頭疼的事,而且很容易出現錯誤,Spring支援可插入的事務管理支援,而且無需JEE環境支援,透過Spring管理事務可以把我們從事務管理中解放出來來專注業務邏輯。
●JDBC抽象及ORM框架支援:Spring使JDBC更加容易使用;提供DAO(資料訪問物件)支援,非常方便整合第三方ORM框架,比如Hibernate等;並且完全支援Spring事務和使用Spring提供的一致的異常體系。
●靈活的Web層支援:Spring本身提供一套非常強大的MVC框架,而且可以非常容易的與第三方MVC框架整合,比如Struts等。
●簡化各種技術整合:提供對Java Mail、任務排程、JMX、JMS、JNDI、EJB、動態語言、遠端訪問、Web Service等的整合。
Spring能幫助我們簡化應用程式開發,幫助我們建立和組裝物件,為我們管理事務,簡單的MVC框架,可以把Spring看作是一個超級粘合平臺,能把很多技術整合在一起,形成一個整體,使系統結構更優良、效能更出眾,從而加速我們程式開發,有如上優點,我們沒有理由不考慮使用它。
如何學好Spring
要學好Spring,首先要明確Spring是個什麼東西,能幫我們做些什麼事情,知道了這些然後做個簡單的例子,這樣就基本知道怎麼使用Spring了。Spring核心是IoC容器,所以一定要透徹理解什麼是IoC容器,以及如何配置及使用容器,其他所有技術都是基於容器實現的;理解好IoC後,接下來是面向切面程式設計,首先還是明確概念,基本配置,最後是實現原理,接下來就是資料庫事務管理,其實Spring管理事務是透過面向切面程式設計實現的,所以基礎很重要,IoC容器和麵向切面程式設計搞定後,其餘都是基於這倆東西的實現,學起來就更加輕鬆了。要學好Spring不能急,一定要把基礎打牢,基礎牢固了,這就是磨刀不誤砍柴工。
Spring基礎
Spring架構圖
圖 1-1 Spring架構圖
核心容器:包括Core、Beans、Context、EL模組。
●Core模組:封裝了框架依賴的最底層部分,包括資源訪問、型別轉換及一些常用工具類。
●Beans模組:提供了框架的基礎部分,包括反轉控制和依賴注入。其中Bean Factory是容器核心,本質是“工廠設計模式”的實現,而且無需程式設計實現“單例設計模式”,單例完全由容器控制,而且提倡面向介面程式設計,而非面向實現程式設計;所有應用程式物件及物件間關係由框架管理,從而真正把你從程式邏輯中把維護物件之間的依賴關係提取出來,所有這些依賴關係都由BeanFactory來維護。
●Context模組:以Core和Beans為基礎,整合Beans模組功能並新增資源繫結、資料驗證、國際化、Java EE支援、容器生命週期、事件傳播等;核心介面是ApplicationContext。
●EL模組:提供強大的表示式語言支援,支援訪問和修改屬性值,方法呼叫,支援訪問及修改陣列、容器和索引器,命名變數,支援算數和邏輯運算,支援從Spring 容器獲取Bean,它也支援列表投影、選擇和一般的列表聚合等。
AOP、Aspects模組:
●AOP模組:Spring AOP模組提供了符合 AOP Alliance規範的面向方面的程式設計(aspect-oriented programming)實現,提供比如日誌記錄、許可權控制、效能統計等通用功能和業務邏輯分離的技術,並且能動態的把這些功能新增到需要的程式碼中;這樣各專其職,降低業務邏輯和通用功能的耦合。
●Aspects模組:提供了對AspectJ的整合,AspectJ提供了比Spring ASP更強大的功能。
資料訪問/整合模組:該模組包括了JDBC、ORM、OXM、JMS和事務管理。
●事務模組:該模組用於Spring管理事務,只要是Spring管理物件都能得到Spring管理事務的好處,無需在程式碼中進行事務控制了,而且支援程式設計和宣告性的事物管理。
●JDBC模組:提供了一個JBDC的樣例模板,使用這些模板能消除傳統冗長的JDBC編碼還有必須的事務控制,而且能享受到Spring管理事務的好處。
●ORM模組:提供與流行的“物件-關係”對映框架的無縫整合,包括Hibernate、JPA、Ibatiss等。而且可以使用Spring事務管理,無需額外控制事務。
●OXM模組:提供了一個對Object/XML對映實現,將java物件對映成XML資料,或者將XML資料對映成java物件,Object/XML對映實現包括JAXB、Castor、XMLBeans和XStream。
●JMS模組:用於JMS(Java Messaging Service),提供一套 “訊息生產者、訊息消費者”模板用於更加簡單的使用JMS,JMS用於用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。
●Web/Remoting模組:Web/Remoting模組包含了Web、Web-Servlet、Web-Struts、Web-Porlet模組。
●Web模組:提供了基礎的web功能。例如多檔案上傳、整合IoC容器、遠端過程訪問(RMI、Hessian、Burlap)以及Web Service支援,並提供一個RestTemplate類來提供方便的Restful services訪問。
●Web-Servlet模組:提供了一個Spring MVC Web框架實現。Spring MVC框架提供了基於註解的請求資源注入、更簡單的資料繫結、資料驗證等及一套非常易用的JSP標籤,完全無縫與Spring其他技術協作。
●Web-Struts模組:提供了與Struts無縫整合,Struts1.x 和Struts2.x都支援
Test模組: Spring支援Junit和TestNG測試框架,而且還額外提供了一些基於Spring的測試功能,比如在測試Web框架時,模擬Http請求的功能。
典型應用場景
Spring可以應用到許多場景,從最簡單的標準Java SE程式到企業級應用程式都能使用Spring來構建。以下介紹幾個比較流行的應用場景:
●典型Web應用程式應用場景:
圖1-2 web應用程式應用場景
在Web應用程式應用場景中,典型的三層架構:資料模型層實現域物件;資料訪問層實現資料訪問;邏輯層實現業務邏輯;web層提供頁面展示;所有這些層元件都由Spring進行管理,享受到Spring事務管理、AOP等好處,而且請求唯一入口就是DispachterServlet,它透過把請求對映為相應web層元件來實現相應請求功能。
●遠端訪問應用場景:
Spring能非常方便的提供暴露RMI服務,遠端訪問服務如Hessian、Burlap等,實現非常簡單隻需透過在Spring中配置相應的地址及需要暴露的服務即可輕鬆實現,後邊會有介紹;
●EJB應用場景:
Spring也可以與EJB輕鬆整合,後邊會詳細介紹。
注:如果想要更加深入的瞭解IoC和DI,請參考大師級人物Martin Fowler的一篇經典文章《Inversion of Control Containers and the Dependency Injection pattern》,原文地址: 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69906029/viewspace-2654860/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring原始碼剖析9:Spring事務原始碼剖析Spring原始碼
- Spring原始碼剖析6:Spring AOP概述Spring原始碼
- Spring原始碼剖析8:Spring事務概述Spring原始碼
- spring 原始碼解析之開篇Spring原始碼
- Spring原始碼剖析1:初探Spring IOC核心流程Spring原始碼
- Spring原始碼剖析2:初探Spring IOC核心流程Spring原始碼
- Spring AOP 原理原始碼深度剖析Spring原始碼
- Spring 原始碼(3)Spring BeanFactory 是怎麼建立的?Spring原始碼Bean
- Spring 是什麼?Spring
- Spring原始碼剖析3:Spring IOC容器的載入過程Spring原始碼
- 整合原始碼深度剖析:Fescar x Spring Cloud原始碼SpringCloud
- 一篇告訴你什麼是SpringSpring
- Spring認證_什麼是Spring GraphQL?Spring
- Spring認證_什麼是Spring Security?Spring
- Spring認證_什麼是Spring GraphQLSpring
- 「Spring認證」什麼是Spring GraphQL?Spring
- Spring IOC原始碼深度剖析:Spring IoC迴圈依賴問題Spring原始碼
- 什麼是Spring Data?Spring
- 什麼是Spring Boot?Spring Boot
- Spring 原始碼第一篇開整!配置檔案是怎麼載入的?Spring原始碼
- Spring AOP高階應用與原始碼剖析Spring原始碼
- 什麼是Spring Boot?為什麼要學習Spring Boot?Spring Boot
- Spring原始碼分析——搭建spring原始碼Spring原始碼
- 什麼是 Spring AOT 引擎?Spring
- 什麼是Spring Framework 框架?SpringFramework框架
- 什麼是Spring Boot Starters?Spring Boot
- Spring boot與Spring cloud 是什麼關係?Spring BootCloud
- Spring Boot與Spring Cloud是什麼關係?Spring BootCloud
- Spring原始碼剖析7:AOP實現原理詳解Spring原始碼
- 精盡Spring Boot原始碼分析 - 剖析 @SpringBootApplication 註解Spring Boot原始碼APP
- 【長文剖析】Spring Cloud OAuth 生成Token 原始碼解析SpringCloudOAuth原始碼
- Spring系列(一):Spring MVC bean 解析、註冊、例項化流程原始碼剖析SpringMVCBean原始碼
- spring boot與spring mvc的區別是什麼?Spring BootMVC
- spring原始碼之refresh第二篇Spring原始碼
- 從原始碼層面深度剖析Spring迴圈依賴原始碼Spring
- Spring Aware 到底是什麼?Spring
- Spring IoC 到底是什麼Spring
- spring中FactoryBean是什麼beanSpringBean