簡述Spring技術內幕

Java學習錄發表於2019-03-22

相信任何一個開發者都使用過Spring這個框架,或許你剛開始使用Spring、或許你有看過原始碼解析系列文章、或許你曾除錯過原始碼、或許你。。。總之不管你的情況如何,你有想過自己實現一個Spring框架麼?本篇文章就就來簡單描述一下Spring中的IOC、MVC、AOP都是如何實現的

IOC

1. 載入配置

早期的Spring框架關於bean的定義都是配置在xml檔案中的,就算是現在有了Service、Controller等註解、有了SpringBoot號稱減少大部分配置,但是關於資料庫的等相關資訊也是存在於配置檔案的。所以作為框架來說載入配置檔案是必不可少的功能。

2. 類載入器

首先通過上一步我們獲取到了xml中定義的bean,以及包掃描的路徑,根據獲取的這兩種配置我們就需要把這些bean例項化出來。怎麼去例項化呢,分為兩個步驟:

  1. 首先根據配置的包掃描路徑獲取這個包下面的所有類,然後判斷類上是否存在Spring的相關注解,如果有的話就把這些類先儲存到一個set集合中
  2. 將配置檔案中定義的bean也新增的步驟一獲取的set集合中,這樣就得到了所有需要被Spring管理的類了。

3. Bean容器

通過第二步我們已經知道了哪些類需要被Spring來管理,那麼現在我們就可以通過反射來把set集合中的類例項化出來,例項化出來的這些類我們統一把它們放到一個全域性的靜態Map中。

4. 依賴注入

我們知道使用IOC最直觀的一個表現就是我們使用的物件不用自己new了,那麼這個功能是如何實現的呢?

想想我們現在使用的自動注入,是不是自動注入的變數都會使用@Resource和@Autowired來標示呢。簡單來說,在第三步所有的Bean都例項化以後,我們需要遍歷所有Map中的例項,通過反射獲取例項的所有屬性,當有屬性上方有剛才提到的兩個註解時就去Map中尋找對應的例項來進行賦值。這樣當把Map遍歷完畢以後依賴注入的功能也就完成了。

AOP

寫一個AOP框架需要一個前提,那就是你需要懂代理模式。
獲取所有需要被攔截的方法或類,然後根據增強型別通過動態代理模式為這些方法或類生成代理物件,然後把代理物件放入到SpringIOC管理的Map中。

MVC

1. MVCBean容器

我們知道@Controller註解是標誌著一個類是用於處理MVC請求的,這樣的話我們就可以在實現IOC功能例項化類的時候把所有帶有@Controller註解的類複製一份放在一個MVCBean容器當中。

2. 建立請求對映關係

僅僅只有一個MVCBean容器是不夠的,還有一個@RequestMapping註解也是必須用到的,我們應該把所有帶有@RequestMapping註解的方法的請求路徑、請求方式、請求引數、例項名、方法名都記錄下來。這樣當一個請求過來以後根據請求路徑、方式和引數定義到例項的方法,然後通過反射來呼叫這個方法。

3. 返回值處理

我們知道有的方法返回的是一個view而有的方法返回的是json資料,這種情況就得根據方法是是否含有@ResponseBody註解來判斷,如果沒有此註解就在反射呼叫方法完畢後通知瀏覽器跳轉到結果路徑、如果包含此註解的話就需要序列化json資料寫入HttpServletResponse從而輸出到瀏覽器。

簡述Spring技術內幕


相關文章