Spring 源碼學習 02:關於 Spring IoC 和 Bean 的概念

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"前言","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在前一篇文章中介紹瞭如何構建源碼閱讀環境,既然構建好了源碼環境,本地也可以正常運行,那就開始閱讀源碼吧!","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在閱讀源碼時,會參考","attrs":{}},{"type":"link","attrs":{"href":"https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core","title":""},"content":[{"type":"text","text":"官方文檔","attrs":{}}]},{"type":"text","text":",很多概念在官網都可以得到答案,有興趣的小夥伴們可以繼續閱讀,當做複習,寫的不足之處,希望多多指導。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"IoC 和 DI","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/c5/c58cb4a04b9b9bee9043d610d1919fbc.png","alt":"IoC 概念","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"IoC","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"IoC(Inversion of Control),即控制反轉。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"之前是在對象內部 new 創建其他對象,然後使用。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而現在 Spring 中有一個容器可以在創建管理這些對象,並且將對象依賴的其他對象注入到這個對象中,這些對象的創建、銷燬都由 Spring 進行管理。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"相比以前來說,不再由自己控制其他對象的生命週期,這個過程就叫做控制反轉。而負責統一管理這些類的容器就叫做 IoC 容器。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"DI","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"IoC is also known as dependency injection (DI).","attrs":{}}],"attrs":{}},{"type":"text","text":" ","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"是不是感覺奇奇怪怪的,爲什麼說:","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"IoC 也稱爲 DI","attrs":{}}],"attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其實 IoC 和 DI 是同一個概念的不同角度描述。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"依賴注入是指組件之間的依賴關係由容器在運行期決定,形象的說,即由容器動態的將某個依賴關係注入到組件之中。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過依賴注入機制,我們只需要通過簡單的配置,而無需任何代碼就可指定目標需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰實現。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Spring 是通過 DI 實現 IoC 的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"Container 和 Bean","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/54/54f076ef8a460d1d31e83759cfec26f1.png","alt":"Spring IoC container and Bean","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"Bean 是一個由 Spring IoC 容器實例化,組裝和管理的對象。","attrs":{}}],"attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"相信大家都寫過或者見過下面的代碼:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"/**\n * 從容器中獲取對象\n * @author liuzhihang\n * @date 2020/4/6 19:02\n */\n@Component\npublic class CustomBeanFactory implements ApplicationContextAware {\n\n private static ApplicationContext ctx;\n\n @Override\n public void setApplicationContext(ApplicationContext ac) throws BeansException {\n\n ctx = ac;\n }\n\n public static Object getBean(String beanName) {\n\n return ctx.getBean(beanName);\n }\n}","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼邏輯很簡單,就是從容器中獲取到指定名稱的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Bean","attrs":{}}],"attrs":{}},{"type":"text","text":",而其中 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ApplicationContext","attrs":{}}],"attrs":{}},{"type":"text","text":" 接口其實就是 Spring IoC 容器。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ApplicationContext","attrs":{}}],"attrs":{}},{"type":"text","text":" 是一個接口,它有很多實現,而它也繼承了 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"BeanFactory","attrs":{}}],"attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/62/6258133dff67e25067c08b89b9d78771.png","alt":"BeanFactory or ApplicationContext","title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雖然 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"BeanFactory","attrs":{}}],"attrs":{}},{"type":"text","text":" 是 IoC 容器的最基本的形式,但是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ApplicationContext","attrs":{}}],"attrs":{}},{"type":"text","text":" 對其進行了很多擴展,並具有 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"BeanFactory","attrs":{}}],"attrs":{}},{"type":"text","text":" 的所有功能,通常建議優先使用 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ApplicationContext","attrs":{}}],"attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"總結","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在通過","attrs":{}},{"type":"link","attrs":{"href":"https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core","title":""},"content":[{"type":"text","text":"Spring 官網","attrs":{}}]},{"type":"text","text":" 瞭解了 IoC 、DI 、容器和 Bean 的概念後,再結合平常的使用基本上可以有個大概流程。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/67/67f7791b516be90f015124cb1c616ab9.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然,這只是一個很粗略的猜想,是否正確,還有待後面繼續閱讀源碼,然後去驗證。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"相關推薦","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://mp.weixin.qq.com/s/gDhJMSPSX2vz68p5X3juow","title":""},"content":[{"type":"text","text":"Spring 源碼學習 01:源碼閱讀環境的搭建","attrs":{}}]}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://mp.weixin.qq.com/s/BORxKatt9qs4rDgmAHbv_A","title":""},"content":[{"type":"text","text":"Spring 自調用事務失效,你是怎麼解決的?","attrs":{}}]}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://mp.weixin.qq.com/s/ZJB-2WWeJFG7RQxaksNBuA","title":""},"content":[{"type":"text","text":"APP 莫名崩潰,開始以爲是 Header 中 name 大小寫的鍋,最後發現原來是容器的錯","attrs":{}}]}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章