Spring中的IOC和AOP、事務傳播行爲、MVC

什麼是Spring:

  Spring是一個開源的,輕量級的IOC和AOP容器框架,簡化了開發流程,方便了對其他框架的整合

控制反轉(Inversion Of Controll):

  將相互依賴對象的創建和協調工作都交由IOC容器來完成,當某個對象需要其他協作對象時,由IOC通過依賴注入(DI, Dependency Injection)的方式提供協作對象,達到只需要關注業務本身邏輯的目的。

IOC源碼中的實現思路

1. 獲取 Bean 的定義
  Spring 中有 AnnotationConfigApplicationContext、ClassPathXmlApplicationContext 等類尋找定義的 Bean 。

AnnotationConfigApplicationContext通過掃描包來尋找@Controller、@Service之類的註解,這些類都是@Component的派生註解。
在這裏插入圖片描述
2. 實例化 Bean 並利用反射注入字段或屬性
3. 添加 Bean 到 Map 容器中

面向切面編程(Aspect Oriented Programming):

效果:分離系統中的各種關注點,進一步解耦模塊間的相互依賴,提高模塊的重用性

應用場景:權限認證、日誌、事務、全局事務處理等,幾乎業務功能都需要的功能

Spring AOP自動選擇JDK動態代理和CGLIB動態代理:

JDK動態代理需要類實現接口,重寫類InvocationHandler中的invok方法,來調度目標對象的方法;

CGLIB動態代理在運行時動態的生成某個類的子類(如果某個類被標記爲final,那麼它是無法使用CGLIB做動態代理的),重寫接口MethodInterceptor中的intercept方法,來調度目標對象的方法。

使用AOP方式實現系讀寫分離

代理模式

Spring中基於AspectJ的AOP開發:

通過Pointcut定義表達式攔截指定的Joinpoint,再使用Advice在指定的位置增強。
在這裏插入圖片描述

Spring中的事務:

Spring 並不直接支持事務,只有當數據庫支持事務時,Spring 才支持事務。

Spring中有聲明式和編程式(淘汰)事務,聲明式事務是基於Spring AOP方式實現的

聲明式事務隔離級別:

較SQL標準的四種隔離級別多一個,爲使用數據庫默認的隔離級別(isolation_default)。(事務隔離參考:https://blog.csdn.net/BigBug_500/article/details/89452904)

聲明式事務傳播特性:

傳播特性是Spring在當前線程內,處理多個 數據庫操作方法事務時 所做的一種事務應用策略,且作用於內層的方法上(多個方法的嵌套調用,最外層方法不存在傳播)。

Spring提供的事務七大傳播方式:

  1. propagation_required(必須的,默認): 如果外層事務不存在,內層就主動開啓事務;否則使用外層事務

  2. propagation_supports(支持) : 如果外層事務不存在,就不使用事務;否則使用外層事務

  3. propagation_mandatory(強制) : 如果外層事務不存在,就拋出異常;否則使用外層事務

  4. propagation_requires_new(必須要新的) : 總是開啓一個新事務;如果存在外層事務,就將外層事務掛起

  5. propagation_not_supported(不支持) : 總是不開啓事務;如果存在外層事務,就將外層事務掛起

  6. propagation_never(從不) :總是不使用事務;如果存在外層事務,就拋出異常。與mandatory相反

  7. propagation_nested(嵌套) :如果外層事務不存在,就主動創建事務;否則創建嵌套的子事務。外層事務若回滾,會帶着子事務一同回滾;子事務若回滾,則到 savepoint (即 剛進入 子事務的暫存點),不會影響到外層事務

不同傳播特性間的對比:

nested 與 required 外層事務不存在,都會主動創建事務,那他們兩者有什麼區別?
   required 外內層方法使用的是同一個事務,只要發生異常,外內層都要回滾;nested 內層使用的是外層的子事務,發生異常回滾時,要視情況而定(如上7中解釋)。

nested 與 requires_new 在內層事務異常回滾時,都不會影響到外層事務,那他們兩者有什麼區別?
  nested使用的是外層事務的子事務,回滾時,會回到對應的 savepoint ,且外層事務的回滾會帶動嵌套內層事務回滾;requires_new的外內層使用的是兩個獨立的事務,內層事務的操作,不會影響外層事務。

事務傳播特性的代碼用例

Spring MVC與Boot:

是基於 Servlet 的一個 MVC 框架,主要解決 WEB 開發的問題,其具體執行過程可參考:https://blog.csdn.net/BigBug_500/article/details/89604300。

由於配置繁瑣,每次項目的配置都大同小異等問題,於是出現Spring Boot自動配置的概念。Spring Boot本身並不提供Spring框架的核心特性以及擴展功能,但集成了大量常用的第三方庫配置,所以只需要極少量的配置代碼。

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