Spring容器是Spring框架的核心。容器將創(chuàng)建對象,它們連接在一起,配置它們,并從創(chuàng)建到銷毀管理他們的整個生命周期。在Spring容器使用依賴注入(DI)來管理組成應(yīng)用程序的組件。這些對象被稱為Spring Beans。
容器獲得其上的哪些對象進行實例化,配置和組裝通過閱讀提供的配置元數(shù)據(jù)的說明。配置元數(shù)據(jù)可以通過XML,Java注釋或Java代碼來表示。下面的圖是Spring如何工作的高層次圖。 Spring IoC容器是利用Java的POJO類和配置元數(shù)據(jù)的產(chǎn)生完全配置和可執(zhí)行的系統(tǒng)或應(yīng)用程序。
Spring提供了BeanFactory和ApplicationContext兩種不同類型的容器:
BeanFactory容器
這是最簡單的容器提供DI的基本支持,并由org.springframework.beans.factory.BeanFactory 接口中定義。BeanFactory或者相關(guān)的接口,例如實現(xiàn)BeanFactoryAware,InitializingBean,DisposableBean,仍然存在在Spring向后兼容性與大量的 Spring 整合第三方框架的目的。
有相當數(shù)量的接口來提供直出隨取即用的Spring 的 BeanFactory接口的實現(xiàn)。最常用BeanFactory 實現(xiàn)的是 XmlBeanFactoryclass。此容器從XML文件中讀取配置元數(shù)據(jù),并使用它來創(chuàng)建一個完全配置的系統(tǒng)或應(yīng)用程序。
BeanFactory中通常是首選的資源,如移動設(shè)備或基于applet的應(yīng)用受到限制。因此,使用一個ApplicationContext,除非你有一個很好的理由不這樣做。
例如:
讓我們使用 Eclipse IDE,然后按照下面的步驟來創(chuàng)建一個Spring應(yīng)用程序:
這里是HelloWorld.java文件的內(nèi)容:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package com.yiibai; public class HelloWorld { private String message; public void setMessage(String message){ this .message = message; } public void getMessage(){ System.out.println( "Your Message : " + message); } } |
下面是第二個文件 MainApp.java 的內(nèi)容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package com.yiibai; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class MainApp { public static void main(String[] args) { XmlBeanFactory factory = new XmlBeanFactory ( new ClassPathResource( "Beans.xml" )); HelloWorld obj = (HelloWorld) factory.getBean( "helloWorld" ); obj.getMessage(); } } |
有以下兩個要點需要注意在主要程序中:
第一步是創(chuàng)建工廠對象,我們使用的框架API XmlBeanFactory() 來創(chuàng)建工廠bean,并使用ClassPathResource() API來加載在CLASSPATH中可用的bean配置文件。在API 需要 XmlBeanFactory() 創(chuàng)建和初始化所有對象。在配置文件中提到的 bean 類。
第二個步驟是用來使用創(chuàng)建的bean工廠對象的 getBean() 方法獲得所需的 bean。此方法使用bean 的 id 返回,最終可以構(gòu)造到實際對象的通用對象。一旦有了對象,就可以使用這個對象調(diào)用任何類方法。
以下是bean配置文件beans.xml中的內(nèi)容
1
2
3
4
5
6
7
8
9
10
11
12
|
<? 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.0.xsd"> < bean id = "helloWorld" class = "com.yiibai.HelloWorld" > < property name = "message" value = "Hello World!" /> </ bean > </ beans > |
一旦創(chuàng)建源和bean配置文件來完成,讓我們運行應(yīng)用程序。如果一切順利,您的應(yīng)用程序,這將打印以下信息:
1
|
Your Message : Hello World! |
ApplicationContext容器
應(yīng)用程序上下文(Application Context)是Spring更先進的容器。以它的BeanFactory類似可以加載bean定義,并根據(jù)要求分配bean。此外,它增加了更多的企業(yè)特定的功能,例如從一個屬性文件解析文本消息的能力,并發(fā)布應(yīng)用程序事件感興趣的事件監(jiān)聽器的能力。此容器是由org.springframework.context.ApplicationContext 接口定義。
ApplicationContext 包括了 BeanFactory 所有的功能,因此通常建議在 BeanFactory。 BeanFactory中仍然可以用于重量輕的應(yīng)用,如移動裝置或基于小應(yīng)用程序的應(yīng)用程序。
最常用的 ApplicationContext 實現(xiàn)是:
FileSystemXmlApplicationContext: 這個容器加載從一個XML文件中的bean的定義。在這里,你需要提供給構(gòu)造函數(shù)中的XML bean配置文件的完整路徑。
ClassPathXmlApplicationContext 這個容器加載從一個XML文件中的bean的定義。在這里,您不需要提供XML文件的完整路徑,但你需要正確設(shè)置CLASSPATH,因為這個容器會看在CLASSPATH中bean的XML配置文件.
WebXmlApplicationContext: 此容器加載所有的bean從Web應(yīng)用程序中定義的XML文件。
我們已經(jīng)看到在Spring 的Hello World示例ClassPathXmlApplicationContext容器的例子,我們將更多地談?wù)揦mlWebApplicationContext 在一個單獨的章節(jié)時,我們將討論基于Web的Spring應(yīng)用程序。所以,讓我們看到FileSystemXmlApplicationContext一個例子。
例子:
我們使用Eclipse IDE,然后按照下面的步驟來創(chuàng)建一個 Spring 應(yīng)用程序:
這里是HelloWorld.java 文件的內(nèi)容:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package com.yiibai; public class HelloWorld { private String message; public void setMessage(String message){ this .message = message; } public void getMessage(){ System.out.println( "Your Message : " + message); } } |
下面是第二個文件MainApp.java 的內(nèi)容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package com.yiibai; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class MainApp { public static void main(String[] args) { ApplicationContext context = new FileSystemXmlApplicationContext ( "C:/Users/ZARA/workspace/HelloSpring/src/Beans.xml" ); HelloWorld obj = (HelloWorld) context.getBean( "helloWorld" ); obj.getMessage(); } } |
有以下兩個要點需要注意在主要程序中:
第一步是創(chuàng)建工廠對象,我們使用的框架API的 FileSystemXmlApplicationContext來從給定的路徑加載bean配置文件之后,創(chuàng)建工廠bean。API的FileSystemXmlApplicationContext()需要創(chuàng)建和初始化所有的對象。在XML bean配置文件中提到的bean類。
第二個步驟是用來使用創(chuàng)建的上下文的getBean()方法獲得所需的bean。此方法使用bean的id返回,最終可以構(gòu)造到實際對象的通用對象。一旦有了對象,我們就可以使用這個對象調(diào)用任何類方法。
以下是bean配置文件beans.xml中的內(nèi)容
1
2
3
4
5
6
7
8
9
10
11
12
|
<? 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.0.xsd"> < bean id = "helloWorld" class = "com.yiibai.HelloWorld" > < property name = "message" value = "Hello World!" /> </ bean > </ beans > |
一旦創(chuàng)建源代碼和bean配置文件完成,讓我們運行應(yīng)用程序。如果一切順利,這將打印以下信息:
1
|
Your Message : Hello World! |
總結(jié)
在ApplicationContext 容器包括BeanFactory的容器的所有功能,所以因此通常建議在BeanFactory。 BeanFactory仍然可以用于重量輕的應(yīng)用,如移動裝置或基于小應(yīng)用程序的應(yīng)用中的數(shù)據(jù)量和速度是顯著。