轉: 完全理解 Spring 容器和應用上下文

本文由 簡悅 SimpRead 轉碼, 原文地址 https://mp.weixin.qq.com/s/o11jVTJRsBi998WlgpfrOwjava

有了 Spring 以後,經過依賴注入的方式,咱們的業務代碼不用本身管理關聯對象的生命週期。業務代碼只須要按照業務自己的流程,走啊走啊,走到哪裏,須要另外的對象來協助了,就給 Spring 說,我想要個對象——因而 Spring 就很貼心的給你個對象。程序員

聽起來彷佛很簡單,使用起來也不難,可是若是僅僅是這樣的拿來主義,倒也灑脫,不用費什麼腦子。。。但是,你就真的不關心,Spring 是從哪裏把對象給你的嗎?web

若是你想要了解 Spring 深一些,而不只僅是拿來用用,那麼你就應該好好思考一下上訴問題,否則,這篇博文你還看個剷剷啊。。。spring

你能夠這樣去思考:Spring 既然要負責應用程序中那麼多對象的建立管理,就像蘋果要生產那麼多的手機(對象)同樣,確定有一個專門搞對象的地方。蘋果生產手機的地方叫工廠,好比富士康,但放在軟件開發中,對於 Spring 搞對象的地方咱們就不叫工廠了,而叫作容器。編程

是的,容器的概念在 java 中你最熟悉的莫過於 Tomcat 了,它正是一個運行 Servlet 的 web 容器,而 Spring 要想實現依賴注入功能,就離不開對象生產的容器——若是沒有容器負責對象的建立管理,你的程序代碼只是喊要對象了,Spring 也無處給你啊。微信

實際上,容器是 Spring 框架實現功能的核心,容器不僅是幫咱們建立了對象那麼簡單,它負責了對象整個的生命週期的管理——建立、裝配、銷燬。app

關於 Spring 的這個容器你最常聽聞的一個術語就是 IOC 容器。所謂 IOC,是一種叫控制反轉的編程思想,網上有很通俗易懂的總結,我就不胡亂闡述了。總之一句話,個人應用程序裏不用再過問對象的建立和管理對象之間的依賴關係了,都讓 IOC 容器給代勞吧,也就是說,我把對象建立、管理的控制權都交給 Spring 容器, 這是一種控制權的反轉,因此 Spring 容器才能稱爲 IOC 容器。框架

不過這裏要釐清一點:並非說只有 Spring 的容器才叫 IOC 容器,基於 IOC 容器的框架還有不少,並非 Spring 特有的。dom

好了,終於把 Spring 的容器概念闡述的差很少了,但有什麼卵用呢?光有容器你其實什麼都幹不了!你覺得容器那麼科幻,跟叮噹貓面前的百寶袋同樣,你想要啥它就給你啥?測試

實際上,容器裏面什麼都沒有,決定容器裏面放什麼對象的是咱們本身,決定對象之間的依賴關係的,也是咱們本身,容器只是給咱們提供一個管理對象的空間而已。那麼,咱們怎麼向容器中放入咱們須要容器代爲管理的對象呢?這就涉及到 Spring 的應用上下文了。

什麼是應用上下文呢,你能夠簡單的理解成就是將你須要 Spring 幫你管理的對象放入容器的那麼一種。。一種。。額。。一種容器對象——是的,應用上下文便是 Spring 容器的一種抽象化表述;而咱們常見的 ApplicationContext 本質上說就是一個維護 Bean 定義以及對象之間協做關係的高級接口。額,聽起來是否是很抽象拗口?那你再讀一遍呢。。。

這裏,咱們必須明確,Spring 的核心是容器,而容器並不惟一,框架自己就提供了不少個容器的實現,大概分爲兩種類型:一種是不經常使用的 BeanFactory,這是最簡單的容器,只能提供基本的 DI 功能;還有一種就是繼承了 BeanFactory 後派生而來的應用上下文,其抽象接口也就是咱們上面提到的的 ApplicationContext,它能提供更多企業級的服務,例如解析配置文本信息等等,這也是應用上下文實例對象最多見的應用場景。

有了上下文對象,咱們就能向容器註冊須要 Spring 管理的對象了。對於上下文抽象接口,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 之間的協做關係:

<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">


        
    
    

而後經過應用上下文將配置加載到 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();
    }

}

以上測試中,我將配置文件 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();
    }
}
public class Test {
    public static void main(String[] args) {
        // 從 java 註解的配置中加載配置到容器
        ApplicationContext context = new AnnotationConfigApplicationContext(ManConfig.class);
        // 從容器中獲取對象實例
        Man man = context.getBean(Man.class);
        man.driveCar();
    }
}

自此,Spring 容器和應用上下文就算闡述的差很少了,具體的技能點在從此的博文中會慢慢的給你們奉上。

原文連接:www.cnblogs.com/chenbenbuyi

****推薦程序員必備微信號 ****

**程序員內參**
微信號:

programmer0001

**推薦理由:**

在這裏,咱們分享程序員相關技術,職場生活,行業熱點資訊。不按期還會分享 IT 趣文和趣圖。這裏屬於咱們程序員本身的生活,工做和娛樂空間。

 ▼長按下方↓↓↓二維碼識別關注
![](https://mmbiz.qpic.cn/mmbiz_jpg/jNmCBexQlC7grRGuAvlTrQKGNVEu7zySj3P6YxicNaicwVnweAeV6ROWsp10kHYj0jn7EhRBbQa60gzHYmloVXkw/640?wx_fmt=jpeg)
相關文章
相關標籤/搜索