1. 程式人生 > >手寫一個HTTP框架:兩個類實現基本的IoC功能

手寫一個HTTP框架:兩個類實現基本的IoC功能

> [jsoncat](https://github.com/Snailclimb/jsoncat): 仿 Spring Boot 但不同於 Spring Boot 的一個輕量級的 HTTP 框架 國慶節的時候,我就已經把 jsoncat 的 IoC 功能給寫了,具體可以看這篇文章《手寫“SpringBoot”近況:IoC模組已經完成》 。 今天這篇文章就來簡單分享一下自己寫 IoC 的思路與具體的程式碼實現。 ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/1843652/202010/1843652-20201014101818379-1426979220.png) **IoC (Inverse of Control:控制反轉)** 和 **AOP(Aspect-Oriented Programming:面向切面程式設計)** 可以說是 Spring 框架提供的最核心的兩個功能。但凡是瞭解過 Spring 的小夥伴,那肯定對這個兩個概念非常非常瞭解。不瞭解的小夥伴,可以檢視[《面試被問了幾百遍的 IoC 和 AOP ,還在傻傻搞不清楚?》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486938&idx=1&sn=c99ef0233f39a5ffc1b98c81e02dfcd4&chksm=cea24211f9d5cb07fa901183ba4d96187820713a72387788408040822ffb2ed575d28e953ce7&token=1112722833&lang=zh_CN#rd)這篇通俗易懂的文章。 考慮到這篇文章要手寫 Spring 框架的 IoC 功能,所以,我這裡還是簡單介紹一下 IoC 。**如果你不太清楚 IoC 這個概念,一定要搞懂之後再看後面具體的程式碼實現環節。** ## IoC 介紹 IoC(Inverse of Control:控制反轉)是一種**設計思想**,也就是 **將原本在程式中手動建立物件的控制權交由Spring框架來管理。** IoC 在其他語言中也有應用,並非 Spring 特有。 ### IoC 容器 **IoC 容器是用來實現 IoC 的載體,被管理的物件就被存放在IoC容器中。**IoC 容器在 Spring 中實際上就是個Map(key,value),Map 中存放了各種被管理的物件。 ### IoC 解決了什麼問題 將物件之間的相互依賴關係交給 IoC 容器來管理,並由 IoC 容器完成物件的注入。這樣可以很大程度上簡化應用的開發,把應用從複雜的依賴關係中解放出來。 **IoC 容器就像是一個工廠一樣,當我們需要建立一個物件的時候,只需要配置好配置檔案/註解即可,完全不用考慮物件是如何被創建出來的。** 在實際專案中一個 Service 類可能有幾百甚至上千個類作為它的底層,假如我們需要例項化這個 Service,你可能要每次都要搞清這個 Service 所有底層類的建構函式,這可能會把人逼瘋。如果利用 IoC 的話,你只需要配置好,然後在需要的地方引用就行了,這大大增加了專案的可維護性且降低了開發難度。 ### IoC 和 DI 別再傻傻分不清楚 IoC(Inverse of Control:控制反轉)是一種**設計思想** 或者說是某種模式。這個設計思想就是 **將原本在程式中手動建立物件的控制權,交由 Spring 框架來管理。** IoC 在其他語言中也有應用,並非 Spring 特有。**IoC 容器是 Spring 用來實現 IoC 的載體, IoC 容器實際上就是個 Map(key,value),Map 中存放的是各種被管理的物件。** IoC 最常見以及最合理的實現方式叫做依賴注入(Dependency Injection,簡稱 DI)。 並且,老馬(Martin Fowler)在一篇文章中提到將 IoC 改名為 DI,原文如下,原文地址:https://martinfowler.com/articles/injection.html 。 ![](https://img2020.cnblogs.com/other/1843652/202010/1843652-20201014101819115-1283140316.png) ## IoC實現思路 > **