11Spring面試寶典

目錄

1.Spring家族

2.IOC

2.1IOC原理

DI

依賴注入(DI)的方式:

IOC的優勢

IOC運行流程

SpringIOC支持的功能

2.2SpringIOC的應用

2.2.1BeanDefinitionRegistry

2.2.2BeanFactory

2.2.3ApplicationContext

2.2.4Bean是如何裝載在spring中的?

2.3.SpringIOC的refresh源碼解析

2.4IOC的getBean源碼解析

bean常見面試題

3.AOP

3.1AOP介紹使用

AOP註解概念

AOP種類

3.2AOP的原理

4.小結:


提前聲明:本篇文章是我個人看視頻截圖的雜亂筆記。爲了方便複習,我會邊發佈邊更新文章。各位大佬不要較真。

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):一旦事務完成,無論發生什麼系統錯誤,它的結果都不應該受到影響,這樣就能從任何系統崩潰中恢復過來。通常情況下,事務的結果被寫到持久化存儲器中。

事務的隔離級別

  1. 髒讀(Dirty read)
  2. 不可重複讀(Nonrepeatable read)
  3. 幻讀(Phantom reads)

事務7種傳播機制如下:

 

4.小結:

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