直擊心靈的spring問題拷問

2021-10-13 09:10:28 字數 1683 閱讀 8977

1、做出乙個ioc容器的思路

實現ioc的思路如下:

2、乙個手寫springmvc的思路

(1)讀取配置

springmvc本質上是乙個servlet,這個 servlet 繼承自 httpservlet。frameworkservlet負責初始化springmvc的容器,並將spring容器設定為父容器。因為本文只是實現springmvc,對於spring容器不做過多講解。

為了讀取web.xml中的配置,我們用到servletconfig這個類,它代表當前servlet在web.xml中的配置資訊。通過web.xml中載入我們自己寫的mydispatcherservlet和讀取配置檔案。

(2)初始化階段

在前面我們提到dispatcherservlet的initstrategies方法會初始化9大元件,但是這裡將實現一些springmvc的最基本的元件而不是全部,按順序包括:

(3)執行階段

3、乙個手寫springmvc的思路

1 掃瞄 aop 包, 獲取 aspect 的類

2 根據 切點 獲取該切點的 類 和 方法

3 根據配置的 類 和 方法 為該類生成乙個**物件

4 將該**物件放入 bean map 中

5 呼叫的時候 將**物件 轉換成需要的物件

spring中的迴圈依賴一直是spring中乙個很重要的話題,一方面是因為原始碼中為了解決迴圈依賴做了很多處理,另外一方面是因為面試的時候,如果問到spring中比較高階的問題,那麼迴圈依賴必定逃不掉。所以還是可以看一下這塊的原始碼,看看spring是如何解決迴圈依賴的問題的。

spring中之所以會出現迴圈依賴跟bean的生命週期有關係,在建立乙個bean的過程中如果依賴的另外乙個bean還沒有建立,就會需要去建立依賴的那個bean,而如果兩個bean相互依賴的話,就會出現迴圈依賴的問題。體現到**層次就是像下面這個樣子的,比如兩個物件相互依賴:

@component

public clas a

@component

publicclassb

另外一種就是自己依賴自己

@component

public class a

spring通過**快取解決了迴圈依賴,其中一級快取為單例池(singletonobjects),二級快取為早期**物件earlysingletonobjects,**快取為早期**物件工廠(singletonfactories)。當a、b兩個類發生迴圈引用時,在a完成例項化後,就使用例項化後的物件去建立乙個物件工廠,並新增到**快取中,如果a被aop**,那麼通過這個工廠獲取到的就是a**後的物件,如果a沒有被aop**,那麼這個工廠獲取到的就是a例項化的物件。當a進行屬性注入時,會去建立b,同時b又依賴了a,所以建立b的同時又會去呼叫getbean(a)來獲取需要的依賴,此時的getbean(a)會從快取中獲取,第一步,先獲取到**快取中的工廠;第二步,呼叫物件工工廠的getobject方法來獲取到對應的物件,得到這個物件後將其注入到b中。緊接著b會走完它的生命週期流程,包括初始化、後置處理器等。當b建立完後,會將b再注入到a中,此時a再完成它的整個生命週期。至此,迴圈依賴結束!

直擊資訊的本質 計數排序

前言 計數排序,顧名思義它是統計每個元素出現的次數。實際上是通過限定了資訊的範圍,在只適用於整數情況下達到了線性時間效能。整數集合在已知範圍的情況下,整數的個數是有限的,實際上限定資料為整數,是把問題從無限多種情況,變成了有限種情況 演算法原理 1.先計算資料中的最大值max最小值min。找出資料範...

直擊資訊的本質 桶排序

前言 桶排序在某種意義上來講它並不是乙個排序演算法,它更像乙個策略方案,事實上的排序還是由別的排序演算法完成,它的步驟分為兩部分 1 資料裝 桶 2 每個 桶 使用其餘的排序演算法進行排序。計數排序實際上是桶排序的特例情況,桶排序代表的是一般情況,資料結構字典的實現思想和桶排序的實現思想一致。演算法...

直擊資訊的本質 陣列

後語傳送門 陣列指多個連續的最小儲存單元所構成的集合,且每個單元只可被乙個陣列使用。陣列會記錄起始最小儲存單元的下標 start 與陣列長度 len 在計算機系統中,可以把記憶體看做乙個超大的陣列 實際上陣列是由,最小儲存單元這個概念規定自然產生的一種資料結構,即多個連續的最小儲存單元稱之為陣列。實...