1. 程式人生 > 實用技巧 >Spring 原始碼學習 02:關於 Spring IoC 和 Bean 的概念

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 的概念後,再結合平常的使用基本上可以有個大概流程。

當然,這只是一個很粗略的猜想,是否正確,還有待後面繼續閱讀原始碼,然後去驗證。

相關推薦