哈囉大家好,我是古古
在上一篇文章中,我們先介紹了 Spring IoC 的原理,以及使用 Spring IoC 的優點,讓大家先對 Spring IoC 有一個初步的認識。
那麼這篇文章,我們就會接著來介紹,在 Spring IoC 中也很重要的兩個名詞:DI 和 Bean,讓大家更全面的了解 Spring IoC,並且這也是後續在實作 Spring Boot 程式時,一個非常重要的概念。
在上一篇文章中有提到,IoC 的全稱是 Inversion of Control,中文翻譯為控制反轉,而 IoC 的概念,就是「將 object(物件)的控制權,交給了外部的 Spring 容器來管理」,所以所謂的 Control(控制),就是「對於 object 的控制權」。
所以有了 IoC 的概念之後,以後所有的 object,就都是由外部的 Spring 容器來進行管理,因此當 Teacher 想要去使用印表機時,就只要跟 Spring 容器去借就好了,Teacher 就不需要自己再去「控制」這個印表機的生命週期了。
而只要提到 IoC,就一定會提到另一個名詞 DI,這兩個名詞可以說是相輔相成的,缺一不可。
DI 的全稱是 Dependency Injection,中文翻譯為「依賴注入」,而其實 DI 依賴注入的概念,我們已經有在前面的 IoC 過程中使用到了!
像是在上面那張圖中,Spring 容器會預先儲存一個 HpPrinter 印表機,因此每當 Teacher 想要使用印表機時,Spring 容器就會將這個 HpPrinter 借給 Teacher 使用,其中這個「我借你」的動作,其實就是「DI 依賴注入」。
所以換句話說的話,每當 Spring 容器想要把 HpPrinter 「借」給 Teacher 使用時,就是表示 Spring 容器把 HpPrinter 給「注入」到 Teacher 這個 class 裡面,因此才稱為是 「DI 依賴注入」。
因此基本上只要有用到「IoC 控制反轉」的地方,一定就要搭配「DI 依賴注入」,因為 IoC 會讓我們把 object 的控制權給交出去,所以後續必定需要搭配 DI,才能夠又把這個 object 「注入」回來給我們使用,因此「IoC + DI」這兩個名詞,可以說是捆綁再一起的概念,他們兩個是相輔相成的!
補充:這裡不得不佩服當初命名 DI 的人,到底是怎麼想到「注入」這個這麼艱難的詞的,文學造詣也太好了吧!!不過老實說他也真的描述的很形象就是了,就像是打針一樣,把 HpPrinter 給注入到 Teacher 裡面。
介紹完了 IoC 和 DI,最後我們來介紹一下什麼是 Bean。
這裡還是舉前面的印表機的例子,當我們使用了 IoC 之後,object 的控制權就會交給 Spring 容器來管理,因此以後所有的 object,他們就都是活在 Spring 容器裡面,由 Spring 容器來管理這個這些 object 的生命週期。
而這些 「由 Spring 容器所管理的 object,我們就賦予他們一個新的名字,叫做 Bean」,所以 Bean 說穿了,其實就只是一個 object 而已,跟我們用 new 去創建的 HpPrinter 是一模一樣的!只是因為這些 object 是被放在 Spring 容器中來管理,所以他們就有了新的名字,叫做 Bean,就只是這樣子而已!
所以以後大家在開發 Spring Boot 程式時,看到 Bean 就不用太緊張,想說這是什麼神奇的東西,他其實就只是由 Spring 容器所管理的 object 而已,本質上和我們直接去 new 一個出來的 object 沒什麼區別。
但也因為 Bean 在 Spring Boot 程式中使用的層面實在是太廣了,後面許多技術都會牽扯到 Bean 的概念,因此建議大家一定要了解 Bean 的意義和用途會比較好!
這篇文章我們延續了上一篇文章對 Spring IoC 的介紹,補足了 Spring IoC 中也很重要的兩個名詞概念:DI 和 Bean,讓大家對於 Spring IoC 有一個更全面的了解。
那麼下一篇文章,我們就會去實際到 IntelliJ 中應用 Spring IoC 的概念,練習在 Spring Boot 的程式中創建一個 Bean,並且將這個 Bean 注入到其他的 class 中,那我們就下一篇文章見啦!
補充:本文是擷取自我開設的線上課程 「Java 工程師必備!Spring Boot 零基礎入門」 的內容,如果你想了解更多的 Spring Boot 的用法,歡迎參考課程簡介 (輸入折扣碼「HH202504KU」即可享 85 折優惠)。