IoC:Inverse of Control(控制反轉(zhuǎn))為了更好的理解用可以這樣通俗易懂的這樣講:IOC主要是說是new一個類來使用,方式分為:開發(fā)這手動創(chuàng)建和SpringIOC容器創(chuàng)建(控制反轉(zhuǎn))。
一個例子控制反轉(zhuǎn)顯然是一個抽象的概念,我們舉一個鮮明的例子來說明。 在現(xiàn)實生活中,人們要用到一樣?xùn)|西的時候,第一反應(yīng)就是去找到這件東西,比如想喝新鮮橙汁,在沒有飲品店的日子里,最直觀的做法就是:買果汁機、買橙子,然后準備開水。值得注意的是:這些都是你自己“主動”創(chuàng)造的過程,也就是說一杯橙汁需要你自己創(chuàng)造。 然而到了今時今日,由于飲品店的盛行,當我們想喝橙汁時,第一想法就轉(zhuǎn)換成了找到飲品店的聯(lián)系方式,通過電話等渠道描述你的需要、地址、聯(lián)系方式等,下訂單等待,過一會兒就會有人送來橙汁了。 請注意你并沒有“主動”去創(chuàng)造橙汁,橙汁是由飲品店創(chuàng)造的,而不是你,然而也完全達到了你的要求,甚至比你創(chuàng)造的要好上那么一些。 Spring IoC 闡述這就是一種控制反轉(zhuǎn)的理念,上述的例子已經(jīng)很好的說明了問題,我們再來描述一下控制反轉(zhuǎn)的概念:控制反轉(zhuǎn)是一種通過描述(在 Java 中可以是 XML 或者注解)并通過第三方(Spring)去產(chǎn)生或獲取特定對象的方式。
主動創(chuàng)建的模式中,責(zé)任歸于開發(fā)者,而在被動的模式下,責(zé)任歸于 IoC 容器,基于這樣的被動形式,我們就說對象被控制反轉(zhuǎn)了。(也可以說是反轉(zhuǎn)了控制) Spring IoC 容器Spring 會提供 IoC 容器來管理和容納我們所開發(fā)的各種各樣的 Bean,并且我們可以從中獲取各種發(fā)布在 Spring IoC 容器里的 Bean,并且通過描述可以得到它。 Spring IoC 容器的設(shè)計Spring IoC 容器的設(shè)計主要是基于以下兩個接口:
其中 ApplicationContext 是 BeanFactory 的子接口之一,換句話說:BeanFactory 是 Spring IoC 容器所定義的最底層接口,而 ApplicationContext 是其最高級接口之一,并對 BeanFactory 功能做了許多的擴展,所以在絕大部分的工作場景下,都會使用 ApplicationContext 作為 Spring IoC 容器。 BeanFactory從上圖中我們可以幾乎看到, BeanFactory 位于設(shè)計的最底層,它提供了 Spring IoC 最底層的設(shè)計,為此,我們先來看看該類中提供了哪些方法: 由于這個接口的重要性,所以有必要在這里作一下簡短的說明:
這就是 Spring IoC 最底層的設(shè)計,所有關(guān)于 Spring IoC 的容器將會遵守它所定義的方法。 ApplicationContext根據(jù) ApplicationContext 的類繼承關(guān)系圖,可以看到 ApplicationContext 接口擴展了許許多多的接口,因此它的功能十分強大,所以在實際應(yīng)用中常常會使用到的是 ApplicationContext 接口,因為 BeanFactory 的方法和功能較少,而 ApplicationContext 的方法和功能較多。 通過上一篇 IoC 的例子,我們來認識一個 ApplicationContext 的子類——ClassPathXmlApplicationContext。
這樣就會使用 Application 的實現(xiàn)類 ClassPathXmlApplicationContext 去初始化 Spring IoC 容器,然后開發(fā)者就可以通過 IoC 容器來獲取資源了啦!
ApplicationContext 常見實現(xiàn)類:1.ClassPathXmlApplicationContext:
2:FileSystemXmlApplicationContext:-
3.XmlWebApplicationContext:
BeanFactory 和 ApplicationContext 的區(qū)別:
Spring IoC 的容器的初始化和依賴注入雖然 Spring IoC 容器的生成十分的復(fù)雜,但是大體了解一下 Spring IoC 初始化的過程還是必要的。這對于理解 Spring 的一系列行為是很有幫助的。 注意:Bean 的定義和初始化在 Spring IoC 容器是兩大步驟,它是先定義,然后初始化和依賴注入的。
做完了以上 3 步,Bean 就在 Spring IoC 容器中被定義了,而沒有被初始化,更沒有完成依賴注入,也就是沒有注入其配置的資源給 Bean,那么它還不能完全使用。 對于初始化和依賴注入,Spring Bean 還有一個配置選項——【lazy-init】,其含義就是是否初始化 Spring Bean。在沒有任何配置的情況下,它的默認值為 default,實際值為 false,也就是 Spring IoC 默認會自動初始化 Bean。如果將其設(shè)置為 true,那么只有當我們使用 Spring IoC 容器的 getBean 方法獲取它時,它才會進行 Bean 的初始化,完成依賴注入。 來源:https://www./content-4-595351.html |
|