Java框架 Spring 核心機制

概念

輕量級的(面向切面AOP)、(IOC控制反轉)容器框架。

Spring優點

1.降低組件之間的耦合性

2.專注于自己業務邏輯,統一的行為(日志、安全等)抽象出來統一處理

3.易于單元測試

4.方便事物處理

5.Spring并不強制應用完全依賴于Spring,開發者可自由選用Spring框架的部分或全部

6 . spring對于主流的應用框架提供了集成支持,如hibernate,JPA,Struts等

7 . spring屬于低侵入式設計,代碼的污染極低

8 . 提供了單例模式支持。

Spring七個模塊

Spring?context

Spring AOP

Spring DAO

Spring ORM

Spring Web

Spring MVC

Spring Core

AOP和IOC

Aop

允許程序通過分離的應用業務邏輯與系統級別服務。程序員只需專注自己的業務邏輯,而不需要管系統級服務。容器中的對象能享有容器中的公共服務(日志、安全)。

原理

通過動態代理做到這一點。用到了代理模式,代理模式是一種靜態代理,而動態代理就是利用反射和動態編譯將代理模式變成動態的。得知被代理類后通過反射得知他的一切信息,然后動態編譯成代理類的class文件(動態組裝成代理類,生成java文件,再編譯成class文件)。

優點

提供另外一種編程思路,可以把類似的行為抽離出來統一處理。

Ioc

依賴注入(DI)和控制反轉(Inversion of Control)是同一個概念??刂茩嗟姆崔D,在程序中對象的控制權轉到容器而不是程序員自己控制,促進了松耦合。依賴注入,將相互依賴的對象分離,在Spring配置文件中,描述他們的依賴關系,用到一個對象時注入,而不需要New一個對象。

原理

通過工廠+反射將我們的bean放到容器中,當我們想用某個bean的時候,只需要調用getBean("beanID")方法。

優點

解耦、統一管理bean,缺點占用內存多、構造對象慢

beanFactory與ApplicationContext

二者是父子關系

Spring的IoC容器就是一個實現了BeanFactory接口的可實例化類,它就是 Spring IoC 容器的真面目。ioc使用 BeanFactory 來實例化、配置和管理 Bean。

如果說BeanFactory是Spring的心臟,那么ApplicationContext就是完整的軀體了,ApplicationContext由BeanFactory派生而來,提供了更多面向實際應用的功能。

(1)MessageSource, 提供國際化的消息訪問

(2)資源訪問,如URL和文件

(3)事件傳播特性,即支持aop特性

1.ApplicationContext接口繼承BeanFactory接口,Spring核心工廠是BeanFactory ,BeanFactory采取延遲加載,第一次getBean時才會初始化Bean, ApplicationContext是會在加載配置文件時初始化Bean。

2.ApplicationContext是對BeanFactory擴展,他可以國際化處理、資源訪問、事件傳播。

Bean的生命周期

建立

1 . Bean的建立

由BeanFactory讀取Bean定義文件,并生成各個實例。

初始化

2 . 依賴注入

3.setBeanName()

4.setBeanFactory()

5.processBeforeInitialization()

初始化之前都會執行這個實例的processBeforeInitialization()方法。

6.afterPropertiesSet()

7.init-method

8.processAfterInitialization()

業務邏輯

9.使用Bean做一些業務邏輯

銷毀

10.destroy()

11.destroy-method

Bean的作用域

1. Singleton: 這是默認的作用域,這種范圍確保不管接受多少個請求,每個容器中只有一個bean的實例,單例模式有BeanFactory自身維護;

2. ?Prototype: 原形范圍與單例范圍相反,為每一個bean請求提供一個實例;

3. Request: 在請求bean范圍內會為每一個來自客戶端的網絡請求創建一個實例,在請求完成以后,bean會失效并被垃圾回收器回收;

4. ?Session: 與請求范圍類似,確保每個session中有一個bean的實例,在session過期后,bean會隨之失效;

Servlet生命周期

1. 初始化階段? 調用init()方法

2. 響應客戶請求階段  調用service()方法

3. 終止階段  調用destroy()方法

設值注入和構造注入及其區別

設值注入:類中定義setter()方法,在配置文件中注入參數

property?name="country"?value="China"?/>

構造注入:類中聲明一個構造方法,并在此方法的參數中定義要注入的對象。

undefinedundefined

undefinedundefined

undefinedundefined

設值注入優點

1. 與傳統的JavaBean的寫法更相似,程序開發人員更容易理解、接受,依賴關系顯得更加直觀、自然。

2. 對于復雜的依賴關系,如果采用構造注入,會導致構造器過于臃腫,難以閱讀。而設值注入不會

三、在某些屬性可選的情況下,多參數的構造器更加笨重。

構造注入優點

1. 構造注入可以在構造器中決定依賴關系的注入順序,優先依賴的優先注入。

2. 對于依賴關系無須變化的Bean,構造注入更有用處。

建議:采用設值注入為主,構造注入為輔的注入策略。對于依賴關系無需變化的注入,盡量采用構造注入;而其它的依賴關系的注入,則考慮設值注入。

Spring實例化bean的三種方法

1.通過構造函數

2.通過靜態工廠方法

factory-method="靜態方法"/>

3.通過實例工廠方法

factory-method="createClientServiceInstance"/>

Bean的參數有id、class、factory-bean、factory-method等

Spring事物管理簡單介紹

包括聲明式事務和編程式事務,編程式的,比較靈活,但是代碼量大,存在重復的代碼比較多;聲明式的比編程式的更靈活,最大的好處是大大減少了代碼量。編程式不常用,接下來介紹聲明式事務管理。

聲明式事務管理建立在AOP之上的,動態代理實現其機制(不改變源碼,對原有的功能動態擴展)。聲明式事務管理使業務代碼不受污染,這正是spring倡導的非侵入式的開發方式。聲明式事物處理也有五種不同的配置方式,單常用的是基于 @Transactional注解的聲明式事務管理。此時在DAO上需加上@Transactional注解,在需要事務處理的類或方法上都可以加。

Spring配置文件中關于事務配置總是由三個組成部分,分別是DataSource、TransactionManager和代理機制這三部分,無論哪種配置方式,一般變化的只是代理機制這部分。

TransactionDefinition接口定義了四種事物屬性是我們需要知道的

事物傳播行為

在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。

TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。這是默認值。

TransactionDefinition.PROPAGATION_REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則把當前事務掛起。

TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。

TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。

TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。

TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。

TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED。

事物隔離級別

TransactionDefinition.ISOLATION_DEFAULT:這是默認值,表示使用底層數據庫的默認隔離級別。對大部分數據庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。

TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的數據。該級別不能防止臟讀,不可重復讀和幻讀,因此很少使用該隔離級別。比如PostgreSQL實際上并沒有此級別。

TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務只能讀取另一個事務已經提交的數據。該級別可以防止臟讀,這也是大多數情況下的推薦值。

TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務在整個過程中可以多次重復執行某個查詢,并且每次返回的記錄都相同。該級別可以防止臟讀和不可重復讀。

TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。

事務超時

所謂事務超時,就是指一個事務所準許實行的最長時辰,假定跨越該時辰限制但事務還沒有完成,則自動回滾事務。

事務只讀屬性

只讀事務用于客戶代碼只讀但不修改數據的情形,只讀事務用于特定情景下的優化,比如使用Hibernate的時候

SpringMVC流程

用戶發送請求至前端控制器DispatcherServlet

DispatcherServlet收到請求調用HandlerMapping處理器映射器。

處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。

DispatcherServlet選擇合適的HandlerAdapter處理器適配器調用處理器

執行處理器(Controller,也叫后端控制器)。

Controller執行完成返回ModelAndView

HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet

DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器

ViewReslover解析后返回具體View

DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。

DispatcherServlet響應用戶

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容