Spring基礎篇——Spring容器和應用上下文理解

来源:https://www.cnblogs.com/chenbenbuyi/archive/2018/01/04/8166304.html
-Advertisement-
Play Games

上文說到,有了Spring之後,通過依賴註入的方式,我們的業務代碼不用自己管理關聯對象的生命周期。業務代碼只需要按照業務本身的流程,走啊走啊,走到哪裡,需要另外的對象來協助了,就給Spring說,我想要個對象——於是Spring就很貼心的給你個對象。聽起來似乎很簡單,使用起來也不難,但是如果僅僅是這 ...


  上文說到,有了Spring之後,通過依賴註入的方式,我們的業務代碼不用自己管理關聯對象的生命周期。業務代碼只需要按照業務本身的流程,走啊走啊,走到哪裡,需要另外的對象來協助了,就給Spring說,我想要個對象——於是Spring就很貼心的給你個對象。聽起來似乎很簡單,使用起來也不難,但是如果僅僅是這樣的拿來主義,倒也灑脫,不用費什麼腦子。。。可是,你就真的不關心,Spring是從哪裡把對象給你的嗎?

  如果你想要瞭解Spring深一些,而不僅僅是拿來用用,那麼你就應該好好思考一下上訴問題,不然,這篇博文你還看個鏟鏟啊。。。你可以這樣去思考:Spring既然要負責應用程式中那麼多對象的創建管理,就像蘋果要生產那麼多的手機(對象)一樣,肯定有一個專門搞對象的地方。蘋果生產手機的地方叫工廠,比如富士康,但放在軟體開發中,對於Spring搞對象的地方我們就不叫工廠了,而叫做容器。是的,容器的概念在java中你最熟悉的莫過於Tomcat了,它正是一個運行Servlet的web容器,而Spring要想實現依賴註入功能,就離不開對象生產的容器——如果沒有容器負責對象的創建管理,你的程式代碼只是喊要對象了,Spring也無處給你啊。實際上,容器是Spring框架實現功能的核心,容器不只是幫我們創建了對象那麼簡單,它負責了對象整個的生命周期的管理——創建、裝配、銷毀。關於Spring的這個容器你最常聽聞的一個術語就是IOC容器。所謂IOC,是一種叫控制反轉的編程思想,網上有很通俗易懂的總結,我就不胡亂闡述了。總之一句話,我的應用程式里不用再過問對象的創建和管理對象之間的依賴關係了,都讓IOC容器給代勞吧,也就是說,我把對象創建、管理的控制權都交給Spring容器,這是一種控制權的反轉,所以Spring容器才能稱為IOC容器。不過這裡要釐清一點:並不是說只有Spring的容器才叫IOC容器,基於IOC容器的框架還有很多,並不是Spring特有的。

  好了,終於把Spring的容器概念闡述的差不多了,但有什麼卵用呢?光有容器你其實什麼都幹不了!你以為容器那麼科幻,跟叮噹貓面前的百寶袋一樣,你想要啥它就給你啥?實際上,容器裡面什麼都沒有,決定容器裡面放什麼對象的是我們自己,決定對象之間的依賴關係的,也是我們自己,容器只是給我們提供一個裝配對象的空間而已。那麼,我們怎麼向容器中放入我們需要容器代為管理的對象呢?這就涉及到Spring的應用上下文了。什麼是應用上下文呢,你可以先簡單的理解成就是將你需要Spring幫你管理的對象放入容器的那麼一種。。一種。。額。。一種應用上下文吧。

  實際上,Spring的容器並不是單一的,框架本身就有多個容器實現,大概分為兩種類型,一種是不常用的bean工廠,還有一種就是繼承了bean工廠後派生而來的應用上下文,也就是我們常見的ApplicationContext。當然,ApplicationContext只是一個介面,Spring為我們提供了多種類型的上下文實現,供我們在不同的應用場景選擇——

    ① AnnotationConfigApplicationContext:從一個或多個基於java的配置類中載入上下文定義,適用於java註解的方式;

    ② ClassPathXmlApplicationContext:從類路徑下的一個或多個xml配置文件中載入上下文定義,適用於xml配置的方式;

    ③ FileSystemXmlApplicationContext:從文件系統下的一個或多個xml配置文件中載入上下文定義,也就是說系統盤符中載入xml配置文件;

    ④ AnnotationConfigWebApplicationContext:專門為web應用準備的,適用於註解方式;

    ⑤ XmlWebApplicationContext:從web應用下的一個或多個xml配置文件載入上下文定義,適用於xml配置方式。

  然後,問題就很好辦了。你只要將你需要IOC容器替你管理的對象基於xml也罷,java註解也好,總之你要將需要管理的對象(Spring中我們都稱之問bean)、bean之間的協作關係配置好,然後利用應用上下文對象載入進我們的Spring容器,容器就能為你的程式提供你想要的對象管理服務了。下麵,還是貼一下簡單的應用上下文的應用實例:

  我們先採用xml配置的方式配置bean和建立bean之間的協作關係:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
    <bean id="man" class="spring.chapter1.domain.Man">
        <constructor-arg ref="qqCar" />
    </bean>
    <bean  id="qqCar" class="spring.chapter1.domain.QQCar"/>
</beans>
View Code

  然後通過應用上下文將配置載入到IOC容器,讓Spring替我們管理對象,待我們需要使用對象的時候,再從容器中獲取bean就ok了:

public class Test {
    public static void main(String[] args) {
        //載入項目中的spring配置文件到容器
//        ApplicationContext context = new ClassPathXmlApplicationContext("resouces/applicationContext.xml");
        //載入系統盤中的配置文件到容器
        ApplicationContext context = new FileSystemXmlApplicationContext("E:/Spring/applicationContext.xml");
        //從容器中獲取對象實例
        Man man = context.getBean(Man.class);
        man.driveCar();
    }
}
View Code

  以上測試中,我將配置文件applicationContext.xml分別放在項目中和任意的系統盤符下,我只需要使用相應的上下文對象去載入配置文件,最後的結果是完全一樣的。當然,現在項目中越來越多的使用java註解,所以註解的方式必不可少:

//同xml一樣描述bean以及bean之間的依賴關係
@Configuration
public class ManConfig {
    @Bean
    public Man man() {
        return new Man(car());
    }
    @Bean
    public Car car() {
        return new QQCar();
    }
}
View Code
public class Test {
    public static void main(String[] args) {
        //從java註解的配置中載入配置到容器
        ApplicationContext context = new AnnotationConfigApplicationContext(ManConfig.class);
        //從容器中獲取對象實例
        Man man = context.getBean(Man.class);
        man.driveCar();
    }
}
View Code

  自此,Spring容器和應用上下文就算闡述的差不多了,具體的技能點在今後的博文中會慢慢的給大家奉上。博主功力也不深厚,博文有闡述欠妥或者不准確的地方,歡迎大神大仙大俠們指正,陳某不勝感激。


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

-Advertisement-
Play Games
更多相關文章
  • 我使用的Ghost博客一直使用者預設的Casper主題。我向來沒怎麼打理過自己博客,一方面認為自己不夠專業,很難寫出質量比較高的文字;另一方面認為博客太耗時間,很容易影響正常的工作內容。最近公司即將搬遷,我的開發工作也告一段落,因此抽點時間自定義一個自己的博客主頁。 備註:上圖來自GhostChin ...
  • 文檔對象模型是用於HTML和XML文檔的應用程式編程介面,它定義文檔的邏輯結構,以及訪問和操作文檔的方式。 ...
  • 前言 (以下內容為一個朋友所述)今天我想跟大家分享幾個前端經典的面試題,為什麼我突然想寫這麼一篇文章呢?今天我應公司要求去面試了下幾位招聘者,然後又現場整不出幾個難題,就搜了一下前端變態面試題! HAHA,前提我並不是一個變態,欺負人的面試官.只是我希望看看對方的邏輯能力! 從而又拿這些面試題進行了 ...
  • 前面的話 集合、字典和散列表可以存儲不重覆的值。在集合中,我們感興趣的是每個值本身,並把它當作主要元素。在字典中,我們用[鍵,值]的形式來存儲數據。在散列表中也是一樣(也是以[鍵,值]對的形式來存儲數據)。但是兩種數據結構的實現方式略有不同,本文將詳細介紹字典和散列表這兩種數據結構 字典 集合表示一 ...
  • json相信大家都用的多,jsonp我就一直沒有機會用到,但也經常看到,只知道是“用來跨域的”,一直不知道具體是個什麼東西。今天總算搞明白了。下麵一步步來搞清楚jsonp是個什麼玩意。 同源策略 首先基於安全的原因,瀏覽器是存在同源策略這個機制的,同源策略阻止從一個源載入的文檔或腳本獲取或設置另一個 ...
  • 對於一個多人團隊來說,制定一個統一的規範是必要的,因為個性化的東西無法產生良好的聚合效果,規範化可以提高編碼工作效率,使代碼保持統一的風格,以便於代碼整合和後期維護。 2.1 瀏覽器相容 根據公司業務要求而定,一般: 主流程測試:Chrome 30+、IE9+; 完整測試: Chrome 21、IE ...
  • 1、vertical-align基本認識 支持的屬性值: ①線類:baseline(預設),top,middle,bottom ②文本類:text-top,text-bottom ③上標下標類:sub,super ④數值百分比類: 數值和百分比的共性:ⅰ都帶數字;ⅱ都支持負值;ⅲ行為表現一致(都是在 ...
  • 一、表單輸入綁定 1.1、基礎用法 你可以用 v-model 指令在表單控制項元素上創建雙向數據綁定。它會根據控制項類型自動選取正確的方法來更新元素。儘管有些神奇,但 v-model 本質上不過是語法糖,它負責監聽用戶的輸入事件以更新數據,並特別處理一些極端的例子。 v-model 並不關心表單控制項初始 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...