目錄
提前聲明:本篇文章是我個人看視頻截圖的雜亂筆記。爲了方便複習,我會邊發佈邊更新文章。各位大佬不要較真。
1.Spring家族
如何選擇框架
對應的開發者社區是否活躍,是否有名
框架的模塊是否不斷迭代
Spring家族體系
2.IOC
2.1IOC原理
DI
如上圖,我們改動了輪子,那麼整個系統自下而上的依賴組件都得改,這會要了程序員的頭髮的。
依賴注入(DI)的方式:
IOC的優勢
IOC運行流程
SpringIOC支持的功能
依賴注入,依賴檢查,自動裝配,支持集合,指定初始化方法和銷燬方法。支持回調方法。
2.2SpringIOC的應用
2.2.1BeanDefinitionRegistry
2.2.2BeanFactory
2.2.3ApplicationContext
SpringBoot中的SpringApplication.run()方法底層也是使用了ApplicationContext。如下圖所示:
2.2.4Bean是如何裝載在spring中的?
通過@Configuration配置,@Bean標誌初始化一個對象交給spring.
獲取ApplicationContext.getBean()方法來獲取對象。
通過@Component()將類標誌爲給spring管理
通過@ComponentScan掃描裝配好的bean,這裏會報錯,因爲我們的@SpringBootApplication已經有掃描的功能了。
我們通過@Value給複製,之前ApplicationConfig類中的@Bean方法可以全部註釋掉。
我們寫一個接口Pet(寵物),定義一個move()方法。
一個Dog類實現Pet,dog類方法move(輸出running),要加上@Component加載到ioc中。
一個Bird類實現Pet,bird類方法move(輸出flying),要加上@Component加載到ioc中。
Person類中注入Pet,調用pet.move()方法。
我們在Application中調用call方法,spring會報錯,因爲spring也不知道我們要調用dog還是bird的move()方法。
spring容器會告訴我們加入@Primary或者@Qualifier通知spring調用哪個方法。
我們在dog方法中加入@Primary執行一遍,這時候能夠成功運行了。
2.3.SpringIOC的refresh源碼解析
(1)我們從SpringApplication.run()方法一直點,run()-->run()-->代碼最多的地方,找到下圖所示,我們繼續研究一下。
(2)我們繼續點擊refreshContext()方法,這個方法調用了另一個refresh()方法,來到如下圖方法中,我們詳解一下里面做了什麼操作。
prepareRefresh()方法進去後可以看到,裏面設置了容器的啓動時間,撤銷關閉狀態,開啓活躍狀態,初始化屬性元信息,驗證環境信息裏必須存在的屬性。
beanFactory裏面主要獲取我們的beanFactory實例的,也就是我們交給spring管理的@Component。
prepareBeanFactory對beanFactory進行相關設置。
postProcessBeanFactory()對beanFactory進行不同的操作。
invokeBeanFactoryPostProcessors()對beanFactory,調用工廠後處理器,處理各類bean標籤,掃描bean文件,解析成一個個bean等等操作。方法內會調用到ConfigurationClassParser類,這個類會對@Configuration,@Bean,@Import,@SpringBootApplication等標籤進行解析
寫不下去了......丟篇鏈接給你們詳解。
https://www.jianshu.com/p/c7a416ba7950
refresh方法的作用:
2.4IOC的getBean源碼解析
(1)進入從AbstractBeanFactory類,找到我們的getBean()-->doGetBean()
getSingleton獲取我們beanName的實例,獲取一個共享的實例。
getObjectForBeanInstance從緩存或者實例工廠中獲取實例。
bean常見面試題
Spring的5個作用域
SpringBean的生命週期--創建過程--銷燬過程
3.AOP
3.1AOP介紹使用
我們定義一個controller類,給配置請求路徑和請求方法get。
定義一個Aspect類,實現aop的功能,請求之前打印url和ip,請求返回之前打印相應內容。
AOP註解概念
AOP種類
3.2AOP的原理
代理模式代碼案例
定義一個支付接口Payment(銀行)
定義用戶RealPayment
定義支付寶AliPay.
定義ProxyDemo執行
Spring裏代理模式的實現
getBean()源碼分析
先去判斷是否singleton,之後去創建實例,之後去加載屬性等操作。
關鍵地方initializeBean進入下圖。
進入方法後看到調用了processor方法,
最終看到proxy實現方法了
到這裏我們可以看到用一個三元運算符判斷是用jdkProxy還是CGLIB動態生成。
Spring事務
事務的ACID
- 原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要麼全部完成,要麼完全不起作用。
- 一致性(Consistency):一旦事務完成(不管成功還是失敗),系統必須確保它所建模的業務處於一致的狀態,而不會是部分完成部分失敗。在現實中的數據不應該被破壞。
- 隔離性(Isolation):可能有許多事務會同時處理相同的數據,因此每個事務都應該與其他事務隔離開來,防止數據損壞。
- 持久性(Durability):一旦事務完成,無論發生什麼系統錯誤,它的結果都不應該受到影響,這樣就能從任何系統崩潰中恢復過來。通常情況下,事務的結果被寫到持久化存儲器中。
事務的隔離級別
- 髒讀(Dirty read)
- 不可重複讀(Nonrepeatable read)
- 幻讀(Phantom reads)
事務7種傳播機制如下: