Spring IoC 容器詳解 [Spring][IoC 控制反轉][BeanFactory][ApplicationContext]

来源:https://www.cnblogs.com/manongajie/archive/2020/05/08/12853308.html
-Advertisement-
Play Games

Spring IoC,全稱 Spring Inversion of Control ,控制反轉。 IoC(控制反轉) 是指在程式開發中,實例的創建不再由調用者管理,而是由 Spring 容器創建。Spring 容器會負責控製程序之間的關係,而不是由程式代碼直接控制,因此,控制權由程式代碼轉移到了 S... ...


您的“關註”和“點贊”,是信任,是認可,是支持,是動力......

如意見相佐,可留言。
本人必將竭盡全力試圖做到準確和全面,終其一生進行修改補充更新。

目錄

1 Spring IoC 概述

Spring IoC,全稱 Spring Inversion of Control ,控制反轉。

IoC(控制反轉) 是指在程式開發中,實例的創建不再由調用者管理,而是由 Spring 容器創建。Spring 容器會負責控製程序之間的關係,而不是由程式代碼直接控制,因此,控制權由程式代碼轉移到了 Spring 容器中,控制權發生了反轉,這就是 Spring 的 IoC 思想。

簡單理解,IoC(控制反轉)就是控制權的轉移,即把創建(new)對象的權利,反轉給第三方Spring 框架去創建(new)。也就是把對象的創建的權利及對象的生命周期的管理過程交由Spring 框架來處理,從此在開發過程中不再需要關註對象的創建和生命周期的管理,而是在需要時由 Spring 框架提供,這個由 Spring 框架管理對象創建和生命周期的機制稱之為控制反轉。而在創建對象的過程中 Spring 可以依據配置對對象的屬性進行設置,這個過稱之為依賴註入,也即 DI。

示意如下所示:

# 以前

User user = new User();  // 由程式員控制 new 對象
# 現在:

現在 Spring 容器來創建對象
User user = spring容器.get對象("容器中的唯一對象Id");

2 Spring 提供兩種 IoC 容器

2.1 BeanFactory

BeanFactory 是基礎類型的 IoC 容器,它由 org.springframework.beans.facytory.BeanFactory 介面定義,並提供了完整的 IoC 服務支持。

簡單理解,BeanFactory 就是一個管理 Bean 的工廠,它主要負責初始化各種 Bean,並調用它們的生命周期方法。

BeanFactory 介面有多個實現類,最常見的如下所示:

  • org.springframework.beans.factory.xml.XmlBeanFactory:它是根據 XML 配置文件中的定義裝配 Bean 的。

創建 BeanFactory 實例時,需要提供 Spring 所管理容器的詳細配置信息,這些信息通常採用 XML 文件形式管理。

其載入配置信息的代碼具體如下所示:

BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("D://applicationContext.xml"));

2.2 ApplicationContext

ApplicationContext 介面的全路徑為 org.springframework.context.ApplicationContext,它不僅提供了 BeanFactory 的所有功能,還添加了對 i18n(國際化)、資源訪問、事件傳播等方面的良好支持。

ApplicationContext 是 BeanFactory 的子介面,也被稱為應用上下文。

ApplicationContext 介面有兩個常用的實現類,具體如下所示:

  • ClassPathXmlApplicationContext
    該類從類路徑 ClassPath 中尋找指定的 XML 配置文件,找到並裝載完成 ApplicationContext 的實例化工作,具體如下所示:

    # configLocation 參數:用於指定 Spring 配置文件的名稱和位置,如 applicationContext.xml。
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);  
    
  • FileSystemXmlApplicationContext
    該類從指定的文件系統路徑中尋找指定的 XML 配置文件,找到並裝載完成 ApplicationContext 的實例化工作,具體如下所示:

    ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);
    

    它與ClassPathXmlApplicationContext 的區別:
    在讀取 Spring 的配置文件時,FileSystemXmlApplicationContext 不再從類路徑中讀取配置文件,而是通過參數指定配置文件的位置,它可以獲取類路徑之外的資源,如"D:/workspaces/applicationContext.xml"

使用 Spring 框架,當要創建 ApplicationContext 容器時,可以實例化任何一個類(ClassPathXmlApplicationContext 或 FileSystemXmlApplicationContext)。建議如下所示:

  • Java 項目中:通常會採用通過 ClassPathXmlApplicationContext 類實例化 ApplicationContext 容器的方式。
  • Web 項目中:是 Web 伺服器完成實例化 ApplicationContext 容器的工作。Web 伺服器實例化 ApplicationContext 容器通常使用基於 ContextLoaderListener 實現的方式,它只需要在 web.xml 中添加如下代碼:
    <!--指定Spring配置文件的位置,有多個配置文件時,以逗號分隔-->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <!--spring將載入spring目錄下的applicationContext.xml文件-->
    <param-value>
        classpath:spring/applicationContext.xml
    </param-value>
    </context-param>
    <!--指定以ContextLoaderListener方式啟動Spring容器-->
    <listener>
     <listener-class>
       	 org.springframework.web.context.ContextLoaderListener
     </listener-class>
    </listener>
    

3 BeanFactory 和 ApplicationContext 的異同

  • 異:如果 Bean 的某一個屬性沒有註入,則使用 BeanFacotry 載入後,在第一次調用 getBean() 方法時會拋出異常,而 ApplicationContext 則在初始化時自檢,這樣有利於檢查所依賴的屬性是否註入。
  • 同:BeanFactory 和 ApplicationContext 都是通過 XML 配置文件載入 Bean 的。

介紹到這裡,相信大家心裡都有一個“理想對象”了吧?
那就是 ApplicationContext,在日常開發中通常選擇使用的都是這個介面,只有在系統資源較少時,才考慮一下 BeanFactory 哦。

4 文章其他地址

4.1 微信公眾號:碼農阿傑

4.2 CSDN 博客

5 參考資料

5.1 spring

5.2 Artifact Repository Browser

5.3 Apache Commons


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...