Spring 原始碼學習 02:關於 Spring IoC 和 Bean 的概念
前言
在前一篇文章中介紹瞭如何構建原始碼閱讀環境,既然構建好了原始碼環境,本地也可以正常執行,那就開始閱讀原始碼吧!
在閱讀原始碼時,會參考官方文件,很多概念在官網都可以得到答案,有興趣的小夥伴們可以繼續閱讀,當做複習,寫的不足之處,希望多多指導。
IoC 和 DI
IoC
IoC(Inversion of Control),即控制反轉。
之前是在物件內部 new 建立其他物件,然後使用。
而現在 Spring 中有一個容器可以在建立管理這些物件,並且將物件依賴的其他物件注入到這個物件中,這些物件的建立、銷燬都由 Spring 進行管理。
相比以前來說,不再由自己控制其他物件的生命週期,這個過程就叫做控制反轉。而負責統一管理這些類的容器就叫做 IoC 容器。
DI
IoC is also known as dependency injection (DI).
是不是感覺奇奇怪怪的,為什麼說:IoC 也稱為 DI
。
其實 IoC 和 DI 是同一個概念的不同角度描述。
依賴注入是指元件之間的依賴關係由容器在執行期決定,形象的說,即由容器動態的將某個依賴關係注入到元件之中。
通過依賴注入機制,我們只需要通過簡單的配置,而無需任何程式碼就可指定目標需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰實現。
Spring 是通過 DI 實現 IoC 的。
Container 和 Bean
Bean 是一個由 Spring IoC 容器例項化,組裝和管理的物件。
相信大家都寫過或者見過下面的程式碼:
/** * 從容器中獲取物件 * @author liuzhihang * @date 2020/4/6 19:02 */ @Component public class CustomBeanFactory implements ApplicationContextAware { private static ApplicationContext ctx; @Override public void setApplicationContext(ApplicationContext ac) throws BeansException { ctx = ac; } public static Object getBean(String beanName) { return ctx.getBean(beanName); } }
程式碼邏輯很簡單,就是從容器中獲取到指定名稱的 Bean
,而其中 ApplicationContext
介面其實就是 Spring IoC 容器。
當然 ApplicationContext
是一個介面,它有很多實現,而它也繼承了 BeanFactory
。
雖然 BeanFactory
是 IoC 容器的最基本的形式,但是 ApplicationContext
對其進行了很多擴充套件,並具有 BeanFactory
的所有功能,通常建議優先使用 ApplicationContext
。
總結
在通過Spring 官網 瞭解了 IoC 、DI 、容器和 Bean 的概念後,再結合平常的使用基本上可以有個大概流程。
當然,這只是一個很粗略的猜想,是否正確,還有待後面繼續閱讀原始碼,然後去驗證。