1. 程式人生 > >Spring框架的設計理念與設計模式

Spring框架的設計理念與設計模式

如今在javaWeb專案的開發中,離不開Spring框架。Spring作為現在最優秀的框架之一,Spring框架的體系架構的設計理念,有那幾個核心元件?為什麼需要這些元件?它們又是如何結合在一起構成Spring的骨骼架構?Spring的AOP特性又是如何利用這些基礎的骨骼架構來工作的?

Spring的體系結構

Spring總共有十幾個元件,但是真正核心的元件只有幾個,下面是Spring框架的總體架構圖:
這裡寫圖片描述
Spring框架中的核心元件只有三個:Core、Context和Beans。它們構建起了整個Spring的骨骼架構。沒有它們就不可能有AOP、Web等上層的特性功能。下面也將主要從這三個元件入手分析Spring。

Spring框架優點

  • 方便解耦,簡化開發

Spring就是一個大工廠,可以將所有物件建立和依賴關係維護,交給Spring管理

  • AOP程式設計的支援

Spring提供面向切面程式設計,可以方便的實現對程式進行許可權攔截、執行監控等功能

  • 宣告式事務的支援

只需要通過配置就可以完成對事務的管理,而無需手動程式設計

  • 方便程式的測試

Spring對Junit4支援,可以通過註解方便的測試Spring程式

  • 方便整合各種優秀框架

Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支援

  • 降低JavaEE API的使用難度

Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠端呼叫等),都提供了封裝,使這些API應用難度大大降低

IOC容器

Ioc它是什麼,解決什麼問題,它的原理是如何實現?
IOC  inversion of Controller 控制反轉。
IOC(控制反轉)就是控制權由物件本身轉向容器;由容器根據配置檔案去建立例項並建立各個例項之間的依賴關係。
在程式中所說的IOC其實簡單說,就是原來由我們自己例項化的物件交給spring容器來實始化。這時物件的實始化的權利就會反轉。
這裡寫圖片描述

DI

DI:dependency injection 依賴注入
在spring框架負責建立Bean物件時,動態將依賴物件注入到Bean元件。
DI(依賴注入):被呼叫者例項的建立由第三方(Spring 容器)完成,然後注入給呼叫者,移除呼叫者對被呼叫者的依賴。

Bean獲取與例項化

ApplicationContext與BeanFactory關係
這裡寫圖片描述
ApplicationContext它是擴充套件BeanFactory介面。
BeanFactory它採取延遲載入的方案,只有真正在getBean時才會例項化Bean
在開發中我們一般使用的是ApplicationContext,真正使用的是其實現類,
FileSystemXmlAppliCationContext 根據檔案路徑獲取
ClassPathXmlApplicationContext 根據類路徑獲取
AppliCationContext它會在配置檔案載入時,就會初始化Bean,並且ApplicationContext它提供不同的應用層的Context實現。例如在web開發中可以使用WebApplicationContext.

Bean元件

Bean元件在Spring的org.springframework.beans包下。這個包下的所有類主要解決了三件事:Bean的定義、Bean 的建立以及對Bean的解析。對Spring的使用者來說唯一需要關心的就是Bean的建立,其他兩個由Spring在內部幫你完成了,對你來說是透明的。

SpringBean的建立時典型的工廠模式,他的頂級介面是BeanFactory。
BeanFactory有三個子類:ListableBeanFactory、HierarchicalBeanFactory和Autowire Capable Bean Factory。但是從上圖中我們可以發現最終的預設實現類是DefaultListableBeanFactory,他實 現了所有的介面。那為何要定義這麼多層次的介面呢?查閱這些介面的原始碼和說明發現,每個介面都有他使用的場合,它主要是為了區分在Spring內部在操作過程中物件的傳遞和轉化過程中,對物件的 資料訪問所做的限制。例如ListableBeanFactory介面表示這些Bean是可列表的,而HierarchicalBeanFactory表示的是這些Bean是有繼承關係的,也就是每個Bean有可能有父Bean。 AutowireCapableBeanFactory介面定義Bean的自動裝配規則。這四個介面共同定義了Bean的集合、Bean之間的關係、以及Bean行為。

Bean的生命週期

這裡寫圖片描述

  • instantiate bean物件例項化
  • populate properties 封裝屬性
  • 如果Bean實現BeanNameAware執行setBeanName
  • 如果Bean實現BeanFactoryAwar或ApplicationContextAwar設定工廠setBeanFactory或上下文物件setApplicationContext
  • 如果存在類實現BeanPostProcessor(後處理Bean),執行postProcessBeforeInitialization
  • 如果Bean實現InitializingBean執行afterPropertiesSet
  • 呼叫自定義的init-method方法
  • 如果存在類實現BeanPostProcessor(處理Bean),執行postProcessAfterInitialization
  • 執行業務處理
  • 如果Bean實現DisposableBean執行destroy
  • 呼叫自定義的destroy-method

Spring AOP

AOP概述

在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數語言程式設計的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。
AOP是一個概念,並沒有設定具體語言的實現,它能克服那些只有單繼承特性語言的缺點,spring2.0之後整合AspectJ第三方AOP技術。
AspectJ是一個面向切面的框架,它擴充套件了Java語言。AspectJ定義了AOP語法所以它有一個專門的編譯器用來生成遵守Java位元組編碼規範的Class檔案。
主要功能
日誌記錄,效能統計,安全控制,事務處理,異常處理等等
主要意圖
將日誌記錄,效能統計,安全控制,事務處理,異常處理等程式碼從業務邏輯程式碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的程式碼。
AOP與OOP區別
OOP(面向物件程式設計)針對業務處理過程的實體及其屬性和行為進行抽象封裝,以獲得更加清晰高效的邏輯單元劃分。
而AOP則是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。這兩種設計思想在目標上有著本質的差異。
換而言之,OOD/OOP面向名詞領域,AOP面向動詞領域。

目標物件target
指的是需要被增強的物件,由於spring aop是通過代理模式實現,從而這個物件永遠是被代理物件。
連線點(join point)
所謂連線點是指那些被攔截到的點,在spring中這些點指的是方法,因為spring只支援方法型別的連線點
切入點(pointcut)
表示一組 joint point,這些 joint point 或是通過邏輯關係組合起來,或是通過通配、正則表示式等方式集中起來,它定義了相應的 Advice 將要發生的地方
簡單說切入點是指我們要對哪些連線點進行攔截的定義
通知(advice)
所謂通知是指攔截到連線點之後所要做的事情就是通知,通知分為前置通知,後置通知,異常通知,最終通知,環繞通知
Advice 定義了在 pointcut 裡面定義的程式點具體要做的操作
引介introduction
引介是一種特殊的通知,在不修改類程式碼的前提下,introduction可以在執行期為類動態地新增一些方法或屬性
切面aspect
是切入點和通知的結合
織入weaving
織入是一個過程,是將切面應用到目標物件從而創建出AOP代理物件的過程,織入可以在編譯期,類裝載期,執行期進行。
Spring採用動態織入,而aspectj採用靜態織入
代理Proxy
一個類被AOP織入增強後,就產生一個結果代理類
AOP底層實現
AOP分為靜態AOP和動態AOP。靜態AOP是指AspectJ實現的AOP,他是將切面程式碼直接編譯到Java類檔案中。動態AOP是指將切面程式碼進行動態織入實現的AOP。Spring的AOP為動態AOP,實現的技術為: JDK提供的動態代理技術 和 CGLIB(動態位元組碼增強技術)