IoC容器相關(guān)職責和主要實現(xiàn)

IoC容器相關(guān)職責和主要實現(xiàn)

控制反轉(zhuǎn)有以下幾個設計目的

  • 任務執(zhí)行和實現(xiàn)之間解耦(面向?qū)ο蟮脑O計思想)

  • 專注于某個模塊在實施中的任務(這個模塊在任務上的設計目的),即要關(guān)注這個模塊或設計的最終目標,而不是他的具體實現(xiàn)

  • 將模塊從關(guān)于其他系統(tǒng)如何做而依賴合同的假設中釋放出來,即要釋放這個模塊,其他系統(tǒng)要知道它是怎么運作,而不是依賴于它的契約。

  • 當更換模塊時要預防副作用,一般來說,發(fā)生依賴變更時,可能會產(chǎn)生一些相關(guān)的副作用,如果是同步調(diào)用的形式,這個問題可能會比較明顯,如果是IoC的話可能相對不是那么明顯。

IoC容器相關(guān)職責

  1. 依賴處理,依賴查找和依賴注入主要是兩種依賴實現(xiàn)的方式

    1.1 依賴查找,相當于是主動的方式

    1.2 依賴注入,盡管也有主動的方式,但是大部分工作都被容器做了。

    無論依賴查找還是依賴注入,最重要的都是對依賴的處理,如依賴是怎么來的,以及怎么把它返回給客戶端來進行處理的,Spring 中主要有以下兩種大類:

  • 根據(jù)某種規(guī)則進行查找,如根據(jù)名稱或者類型查找

  • 有一些相應的類型轉(zhuǎn)換的方式

  1. 生命周期管理

    2.1 容器相關(guān)的生命周期,容器有自己的啟動、停止或者暫停,或者終止、或者回滾這樣的操作

    2.2 托管的資源的生命周期

    這里所說的資源并非一定指Java Beans,也可能是其他資源,或者普通的POJO等。如 Spring 容器里一些事件,事件對應的監(jiān)聽器有可能不是對應的bean,可能是外部加進去的,當容器發(fā)生事件的時候,可以通過上下文關(guān)聯(lián)一些其他事件的監(jiān)聽,而監(jiān)聽器既不屬于bean也不能通過依賴查找或依賴注入的方式去操作,Spring 的 bean 可以當作監(jiān)聽器的一個來源,但是不是唯一的來源,所以托管的資源不一定是Java beans或者所謂的依賴,也包括一些外部化配置,或外部化資源,如 XML Property這樣的文件

  2. 配置

    3.1 容器的配置,是控制容器的行為,如容器什么時候啟動,有時候容器可以定時啟動的,如定時任務,定時任務可能有些子容器的操作,這也是IoC的一部分,IoC是反轉(zhuǎn)控制,定時器也是一種IoC方式,容器會告訴你什么時候執(zhí)行,你只需要關(guān)注你執(zhí)行的任務就行了,不需要關(guān)注它從哪里來。

    3.2 外部化配置,主要是指屬性配置,還包含一些XML配置

    3.3 托管的資源(Java Beans 或其他資源),如線程池,配置的一些外部容器,如tomcat,動態(tài)的容器等。例如,Spring boot 可以通過嵌入式的方式由 Spring 上下文去影響容器,相反Spring mvc是容器影響到上下文,其中的影響都是相輔相成的。

IoC 容器的主要實現(xiàn)

  1. Java SE

    1.1 Java Beans 依賴查找,Java Beans 是在 Java 1.2的時候就引入到Java API 中,該API是幫助我們來進行bean的管理。Java beans目的不只是為了IoC容器,他還有一些關(guān)于GUI相關(guān)的擴展。

    1.2 Java ServiceLoader SPI,SPI 機制是從Java 1.6開始引入,該機制被大量用于 NetBeans 中,NetBeans通過這種方式來加載一些所謂的組件。

    1.3 JNDI (Java Naming and Directory Interface) ,Java 命名和目錄接口,接口幫助我們查找相應的資源。

    Naming 指 IoC 通過名稱的方式來進行依賴查找,directory是說通常采用一種目錄的方式,有層次結(jié)構(gòu),目錄也會有一些嵌套。

  2. Java EE

    2.1 EJB(Enterprise Java Beans) ,傳統(tǒng)IOC的實現(xiàn),EJB 1或者2 版本中大部分使用的是依賴查找,從EJB 3.0 開始,依賴注入和依賴查找并存。

    2.2 Servlet,在Java中是web的標準技術(shù),該技術(shù)有一些設計模式:如,Model 2的設計模式,特性就是就是通過Java EE Servlet來獲取數(shù)據(jù)庫源、線程池、消息服務等,也是通過JNDI 的方式在server容器、EJB容器、Java EE容器里來進行獲取。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容