首頁 Java java教程 IOC的概念與分析

IOC的概念與分析

Jul 17, 2017 pm 01:36 PM

控制反轉(Inversion of Control,英文縮寫為IoC)是框架的重要特徵,並非物件導向程式設計的專用術語。它與依賴注入(Dependency Injection,簡稱DI)和依賴查找(Dependency Lookup)並沒有關係。

一 .IOC的概念 : IOC (Inversion of Control) 即控制反轉,首先我們要搞清楚什麼被反轉了。 java程式中的業務邏輯大都需要多個物件來協作完成,通常,每個物件在使用他的合作物件時,自己都必須使用像new object() 這樣的語法來完成合作物件的申請工作。這樣一來物件間的耦合度就高了。而IOC的想法是:Spring容器來實現這些相互依賴物件的創建、協調工作。物件只需要關心業務邏輯本身就可以了。從這方面來說,物件如何得到他的協作物件的責任被反轉了。其實,IOC有個比較適合的名字叫做DI (Dependency Injection),也就是依賴注入。

舉個通俗的例子:假設現在有一個企業,企業需要有員工來完成相應的工作,那麼企業就需要自己想方設法的根據需求尋找這方面的的人才來為公司工作。這是一種傳統的方式,假設我們現在有了招聘網站,所有的人才都在網站上註冊自己的信息,寫明自己所擁有的技能和擅長的領域,當某個企業需要人才的時候,招聘網站就將特定的人才提供給公司,這樣企業就只需要發布用人需求就可以了。這個範例中的企業可以認為是業務類別EnterpriseService,人才是業務類別完成工作所需的協助類別Employee。那麼招募網站就相當於IOC容器

<code class="java"><span class="hljs-number"><span style="color: #000000"><br/>1 . 传统获取对象的方式<br/></span></span></code>
登入後複製
public class EnterpriseService {

    Employee employee = new Employee();//自己通过new Object()方式获取对象public void service() {
        employee.doSomething();
    }
}
登入後複製
<code class="java"><span class="hljs-number"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-keyword"><span class="hljs-comment"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-params"><span class="hljs-number">2 . 使用IOC容器方式<br/></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
登入後複製
public class EnterpriseService {

    @Autowired
    Employee employee;//由容器完成对象的获取以及后续生命周期的管理public void service() {
        employee.doSomething();
    }
}
登入後複製

二 . DI 的原理分析
DI的原理很簡單,就是基於java的反射機制實現的。我們在使用spring的時候都會有一個xml設定文件,這個文件用來描述Bean與Bean之間的依賴關係。 IOC容器就是根據這個檔案來維護管理所有的Bean,並提供Bean實例緩存,生命週期管理,Bean實例代理,事件發布,資源裝載等高級任務。
IOC在啟動的時候會透過Resource和ResourceLoader協助完成資源檔案的讀取和解析,並將檔案中Bean的設定資訊儲存起來,然後在實例化該Bean的時候根據對應的類別載入器,透過反射呼叫Bean的setter方法,為實例注入在設定檔中配置的屬性來完成物件的建立。

三. 相關內容
1 . 從注入方法來看,有三種注入方式:建構子注入,屬性注入,介面注入 。 spring支援建構函式註入和屬性注入。
2 . BeanFactory是一個類別工廠,它是spring框架最核心的介面,它提供了高階IOC的設定機制, B​​e​​anFactory使管理不同類型的java物件成為可能,ApplicationContext建立在BeanFactory基礎之上,提供了更多應用程式導向的功能,例如國際化支援和框架時事件體系。
3 . 透過BeanFactory啟動IOC容器的時候並不會立即初始化設定檔中定義的Bean,初始化動作發生在第一次呼叫時。對於單例的Bean來說,BeanFactory會快取Bean的實例(基於HashMap實 現),所以再次呼叫getBeans方法的時候會直接從IOC容器的快取中取得Bean實例。
4 . ApplicationContext的主要實作類別是ClassPathXmlApplication和 FileSystemXmlApplicationContext.而WebApplicationContext繼承了ApplicationContext,是專門為web應用準備的,它允許從相對於web應用根目錄的路徑中尋找和加載設定檔(使用Resource介面和ResourceLoader<策略模式>介面實作)。 WebApplicationContext中可以取得ServletContext引用,整個 WebApplicationContext將作為屬性放置到ServletContext中,以便web應用環境可以存取 spring應用程式上下文。 web應用中增加了三個bean的作用域:request,session,global session 。 WebApplicationContext的初始化方式和BeanFactory和ApplicationContext有所區別,因為它需要ServletContext實例,也就是它必須在擁有web容器的前提下才能完成啟動工作#。
5 .ApplicationContext的初始化和BeanFactory的初始化一個重大的差異是: ApplicationContext在初始化應用程式上下文的時候就實例化所有的Bean。 另一個重大差異是:ApplicationContext會利用java反射機制自動辨識出設定檔中定義的BeanPostProcessor,InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,並自動將他們註冊到應用程式上下文中,而BeanFactory需要在程式碼中手動通過addBeanPostProcessor()方法進行註冊
6 .對於scope="singleton"的Bean,spring會將bean放入IOC容器中緩存起來,將bean的引用返 回給調用者,並且繼續對這些bean進行後續的生命管理。每次呼叫getBeans方法回傳的是同一個bean,而對於scope="prototype"的Bean,spring將bean回傳給呼叫者後不再負責bean的生命 管,每次呼叫getBeans方法都會傳回一個新的bean。

以上是IOC的概念與分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型? Java的類負載機制如何起作用,包括不同的類載荷及其委託模型? Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存? 如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存? Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射? 如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射? Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案? 如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案? Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)? 如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)? Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

See all articles