Spring知識點總結(概念篇)

Spring的優點
①方便解耦,簡化開發。通過Spring提供的IoC容器,我們可以將對象之間的依賴關係交由Spring進行控制,避免硬編碼所造成的過度程序耦合。
②Spring支持聲明式事務。在Spring中,我們可以從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活地進行事務的管理,提高開發效率和質量。
③Spring本身提供了對各種主流框架的支持。Spring提供了對各種優秀框架(如Struts,Hibernate、Hession、Quartz)等的直接支持。
④通過AOP編程,我們將那些與業務無關,卻爲業務模塊所共同調用的邏輯或責任封裝起來,便於減少系統的重複代碼。



什麼是AOP
軟件開發中,業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的一個特點是,他們經常發生在覈心關注點的多處,而各處都基本相似。比如權限認證、日誌、事務處理。AOP 的作用在於分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。

我們把橫切關注點模塊化爲特殊的類,這些類稱爲切面。這樣有兩個好處:①橫切關注點集中在同一處,而不是分散在多出代碼中。②系統真正的業務邏輯代碼更簡潔,他們只包含核心關注點。



AOP 的家庭成員

JoinPoint(連接點)在應用執行過程中能夠插入切面的一個點,這個點可以是調用方法時、拋出異常時甚至是修改一個字段。

PointCut(切點),切點縮小切面所通知的連接點的範圍,它的定義會匹配通知所要織入的一個或多個連接點。

Advice(通知),在切點幹什麼,指定在PointCut地方做什麼事情(增強),打日誌、執行緩存、處理異常等等。

Advisor/Aspect(切面),切面是切點和通知的結合。切點和通知共同定義了切面的全部內容——它是什麼,在何時何處完成什麼功能。

Proxy (代理),其不能算做AOP的家庭成員,更相當於一個管理部門,它管理 了AOP的如何融入OOP。之所以將其放在這裏,是因爲Aspect雖然是面向切面核心思想的重要組成部分,但其思想的踐行者卻是Proxy,也是實現AOP的難點與核心據在。我們常說的代理包括靜態代理、動態代理和基於CGLib代理,關於代理的知識請自行學習。

Weaving織入): 組裝方面來創建一個被通知對象。這可以在編譯時完成(例如使用AspectJ編譯器),也可以在運行時完成。Spring和其他純Java AOP框架一樣,在運行時完成織入。



適合使用AOP的場景
Authentication 權限
Error handling 錯誤處理
Lazy loading 懶加載
logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
Resource pooling 資源池
Synchronization 同步
Transactions 事務



什麼是IoC
簡單的說,對象之間的依賴關係可以通過把對象的依賴注入交給框架或IoC容器來完成。在Spring中的體現是,對象之間的相互依賴關係由IoC容器進行管理,並由IoC容器完成對象的注入。

Java 是一門面向對象的語言,在 Java 中 Everything is Object,我們的程序就是由若干對象組成的。當我們的項目越來越大,合作的開發者越來越多的時候,我們的類就會越來越多,類與類之間的引用就會成指數級的增長。如下圖所示:





這樣的工程簡直就是災難,如果我們引入IoC框架。由框架來維護類的生命週期和類之間的引用。我們的系統就會變成這樣:




這個時候我們發現,我們類之間的關係都由 IoC 框架負責維,同時將類注入到需要的類中。也就是說類的使用者只負責使用,而不負責維護。把專業的事情交給專業的框架來完成。大大的減少開發的複雜度。



IoC容器的基本工作過程
  1. 1. 初始化 IoC 容器。
  2. 2. 讀取配置文件。
  3. 3. 將配置文件轉換爲容器識別的數據結構(這個數據結構在Spring中叫做 BeanDefinition
  4. 4. 利用數據結構依次實例化相應的對象
  5. 5. 注入對象之間的依賴關係



SpringMVC與Struts2的區別
①Struts2是類級別的攔截, 一個類對應一個request上下文,SpringMVC是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,從這個特點來看,SpringMVC更容量使用RESTful API。

②SpringMVC的方法之間基本上獨立,每個方法獨享request和response數據,請求數據通過參數獲取,處理結果通過ModelMap交回給框架,方法之間不共享變量。而Struts2雖然方法之間也是獨立的,但其Action內的變量是共享的,這不會影響程序運行,卻給我們編碼讀程序時帶來麻煩,每次來了請求就創建一個Action,一個Action對象對應一個request上下文。

③由於Struts2需要針對每個request進行封裝,把request,session等servlet生命週期的變量封裝成一個一個Map,供給每個Action使用,並保證線程安全,所以在原則上,是比較耗費內存的。

④SpringMVC的入口是servlet,而Struts2的入口是filter。

⑤SpringMVC開發效率和性能高於Struts2,幾乎零配置,而使用Struts2時,需要頻繁的配置XML文件。



SpringMVC工作原理 


上面的是springMVC的工作原理圖:
1、客戶端發出一個http請求給web服務器,web服務器對http請求進行解析,如果匹配DispatcherServlet的請求映射路徑(在web.xml中指定),web容器將請求轉交給DispatcherServlet。

2、DipatcherServlet接收到這個請求之後將根據請求的信息(包括URL、Http方法、請求報文頭和請求參數Cookie等)以及HandlerMapping的配置找到處理請求的處理器(Handler)。

3-4、DispatcherServlet根據HandlerMapping找到對應的Handler,將處理權交給Handler(Handler將具體的處理進行封裝),再由具體的HandlerAdapter對Handler進行具體的調用。

5、Handler對數據處理完成以後將返回一個ModelAndView()對象給DispatcherServlet。

6、Handler返回的ModelAndView()只是一個邏輯視圖並不是一個正式的視圖,DispatcherSevlet通過ViewResolver將邏輯視圖轉化爲真正的視圖View。

7、Dispatcher通過model解析出ModelAndView()中的參數進行解析最終展現出完整的view並返回給客戶端。




Spring中bean的作用域

單例(singleton)整個應用中,只創建一個bean實例。
原形(prototype)每次注入或通過Spring應用上下文獲取時,都創建一個新的bean實例。
會話(session)在Web應用中,每次會話都創建一個bean實例。
請求(request)在Web應用中,每次請求都創建一個bean實例。


參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章