天天看點

Spring容器及應用上下文Spring容器及應用上下文

Spring容器及應用上下文

關于Spring的這個容器你最常聽聞的一個術語就是IOC容器。所謂IOC,是一種叫控制反轉的程式設計思想,把對象建立、管理的控制權都交給Spring容器,這是一種控制權的反轉,是以Spring容器才能稱為IOC容器。不過這裡要厘清一點:并不是說隻有Spring的容器才叫IOC容器,基于IOC容器的架構還有很多,并不是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容器,容器就能為你的程式提供你想要的對象管理服務了。

1、兩種配置方式

1、通過xml配置的方式配置bean,然後通過應用上下文将配置加載到IOC容器,讓Spring替我們管理對象,待我們需要使用對象的時候,再從容器中擷取bean就ok了:

Spring容器及應用上下文Spring容器及應用上下文

還可以以數組形式:

Spring容器及應用上下文Spring容器及應用上下文

2、以上測試中,将配置檔案applicationContext.xml分别放在項目中和任意的系統盤符下,隻需要使用相應的上下文對象去加載配置檔案,最後的結果是完全一樣的。當然,現在項目中越來越多的使用java注解,是以注解的方式必不可少:

Spring容器及應用上下文Spring容器及應用上下文
Spring容器及應用上下文Spring容器及應用上下文

控制台輸出:

Spring容器及應用上下文Spring容器及應用上下文

2、java注解配置基本注解

1、@Component注解:

@Component是所有受Spring 管理元件的通用形式,@Component注解可以放在類的頭上,把普通pojo執行個體化到spring容器中,告知Spring要為這類建立bean,相當于配置檔案中的:

Spring容器及應用上下文Spring容器及應用上下文

泛指各種元件,就是說當我們的類不屬于各種歸類的時候(不屬于@Controller、@Services等的時候,不好歸類時),我們就可以使用@Component來标注這個類;

2、@ComponentScan注解:

為掃描包注解,隻能作用于類上,spring并不能自動啟用元件掃描,需要進行顯式的配置,使用了@CompontentScan注解來啟用元件掃描。一個類上可以有多個@CompentScan注解。

Spring容器及應用上下文Spring容器及應用上下文

@CompentScan注解中配置baskPackage屬性來完成設定。如果自動完成的配置中包含了我們不需要的部分,則可以使用注解中的exclude屬性來剔除。如果不配置任何屬性則掃描目前包及其子包。

@controller 、@service、@repository 、@component 注解的類,都會把這些類納入進spring容器中進行管理(被@ComponentScan掃描到);

3、@ComponentScans注解:

存在多個@ComponentScan時,可以使用@ComponentScans将這些@ComponentScan放在裡面統一管理,@ComponentScans是一個數組。

Spring容器及應用上下文Spring容器及應用上下文

主類與配置類解耦:

之前都是使用main方法來進行測試的,在實際開發的過程中,如果我們不使用main方法來調用應用程式,也就是說我們的應用程式有可能是通過其他的手段來調用的,比如通過Controller、微信端、安卓端、或者直接通過web浏覽器端等等,那麼主類可能不存在,這時候@ComponentScan注解将沒有地方放置,也就是說應用程式沒有辦法進行自動的元件掃描了,是以我們需要将主類與元件掃描注解@ComponentScan進行解耦,具體的解耦方式就是建立一個類進行元件掃描的配置,也就是配置類:

1、建立bean

Spring容器及應用上下文Spring容器及應用上下文

2、建立配置類

Spring容器及應用上下文Spring容器及應用上下文

3、主類

Spring容器及應用上下文Spring容器及應用上下文

4、運作,測試結果和之前一樣

Spring容器及應用上下文Spring容器及應用上下文