org.springframework.context.ApplicationContext
接口表示Spring IoC容器,負責實例化、配置和組裝bean。容器經過讀取配置元數據獲取關於要實例化、配置和組裝哪些對象的指令,配置元數據用XML、Java註解或Java代碼表示,它容許你表達組成應用程序的對象以及這些對象之間豐富的相互依賴關係。html
Spring提供了ApplicationContext
接口的幾個實現,在獨立應用程序中,一般建立ClassPathXmlApplicationContext或FileSystemXmlApplicationContext的實例。雖然XML一直是定義配置元數據的傳統格式,可是你能夠經過提供少許XML配置來聲明支持這些額外的元數據格式,從而指示容器使用Java註解或代碼做爲元數據格式。java
在大多數應用程序場景中,不須要顯式用戶代碼來實例化Spring IoC容器的一個或多個實例。例如,在web應用程序場景中,在應用程序的web.xml文件中使用8行左右的簡單樣例web描述符XML就足夠了(請參閱方便的web應用程序的ApplicationContext實例化)。若是使用Spring Tool Suite(一個Eclipse支持的開發環境),只需單擊幾下鼠標或按鍵,就能夠輕鬆建立這個樣板配置。web
下圖顯示了Spring如何工做的高級別視圖,你的應用程序類與配置元數據相結合,這樣,在建立並初始化ApplicationContext
以後,你就擁有了一個徹底配置的可執行系統或應用程序。spring
如上圖所示,Spring IoC容器使用一種配置元數據形式,做爲應用程序開發人員,此配置元數據表示如何告訴Spring容器在應用程序中實例化、配置和組裝對象。sql
配置元數據一般以簡單直觀的XML格式提供,本章的大部份內容都使用這種格式來傳達Spring IoC容器的關鍵概念和特性。segmentfault
基於XML的元數據不是唯一容許的配置元數據形式,Spring IoC容器自己與實際編寫配置元數據的格式徹底解耦,如今,許多開發人員爲他們的Spring應用程序選擇基於java的配置。
有關在Spring容器中使用其餘形式的元數據的信息,請參見:api
Spring配置包含容器必須管理的至少一個bean定義,而且一般包含多個bean定義,基於XML的配置元數據將這些bean配置爲頂級<beans/>
元素中的<bean/>
元素,Java配置一般在@Configuration
類中使用@Bean
註解的方法。session
這些bean定義對應於組成應用程序的實際對象,一般,你定義服務層對象、數據訪問對象(DAO)、表示對象(如Struts Action
實例)、基礎設施對象(如Hibernate SessionFactories
)、JMS Queues
等等。一般,不會在容器中配置細粒度域對象,由於一般由DAO和業務邏輯負責建立和加載域對象。不過,你可使用Spring與AspectJ的集成來配置在IoC容器控制以外建立的對象。框架
下面的例子展現了基於XML的配置元數據的基本結構:函數
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions go here --> </beans>
id
屬性是標識單個bean定義的字符串。class
屬性定義bean的類型並使用徹底限定的類名。id
屬性的值引用協做對象,本例中沒有顯示用於引用協做對象的XML,有關更多信息,請參見依賴關係。
提供給ApplicationContext
構造函數的位置路徑或路徑是資源字符串,容許容器從各類外部資源(如本地文件系統、Java CLASSPATH
等)加載配置元數據。
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
在瞭解了Spring的IoC容器以後,你可能想了解更多關於Spring的Resource
抽象的信息,它提供了一種方便的機制,能夠從URI語法中定義的位置讀取InputStream
,特別是,Resource
路徑用於構造應用程序上下文。
下面的示例顯示了服務層對象(services.xml
)配置文件:
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- services --> <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl"> <property name="accountDao" ref="accountDao"/> <property name="itemDao" ref="itemDao"/> <!-- additional collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions for services go here --> </beans>
下面的例子展現了數據訪問對象daos.xml
文件:
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="accountDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao"> <!-- additional collaborators and configuration for this bean go here --> </bean> <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao"> <!-- additional collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions for data access objects go here --> </beans>
在前面的示例中,服務層由PetStoreServiceImpl
類和兩個數據訪問對象JpaAccountDao
和JpaItemDao
類型(基於JPA對象關係映射標準)組成,property name
元素引用JavaBean屬性的名稱,ref
元素引用另外一個bean定義的名稱。id
和ref
元素之間的這種連接表示協做對象之間的依賴關係,有關配置對象依賴關係的詳細信息,請參見依賴關係。
讓bean定義跨多個XML文件是頗有用的,一般,每一個單獨的XML配置文件表示體系結構中的邏輯層或模塊。
你可使用應用程序上下文構造函數從全部這些XML片斷加載bean定義,這個構造函數接受多個Resource
位置,如前一節所示。或者,使用一個或多個<import/>
元素從另外一個或多個文件加載bean定義,下面的例子說明了如何作到這一點:
<beans> <import resource="services.xml"/> <import resource="resources/messageSource.xml"/> <import resource="/resources/themeSource.xml"/> <bean id="bean1" class="..."/> <bean id="bean2" class="..."/> </beans>
在前面的示例中,外部bean定義從三個文件加載:services.xml
、messageSource.xml
和themeSource.xml
,全部位置路徑都相對於執行導入的定義文件,所以services.xml
必須與執行導入的文件位於相同的目錄或類路徑位置,而messageSource.xml
和themeSource.xml
必須位於導入文件位置下方的resources
位置。能夠看到,前面的斜槓被忽略了,可是,因爲這些路徑是相對的,因此最好不要使用斜槓,根據Spring Schema,導入的文件的內容,包括頂層<beans/>
元素,必須是有效的XML bean定義。
它是可能的,但不推薦,在父目錄中引用文件使用一個相對"../
「路徑,這樣作會建立對當前應用程序外部文件的依賴。特別地,這個引用不推薦用於classpath
:url(例如,classpath:../services.xml
),其中運行時解析過程選擇「最近的」類路徑根,而後查看其父目錄,類路徑配置更改可能致使選擇不一樣的、不正確的目錄。你老是可使用徹底限定的資源位置,而不是相對路徑:例如,
file:C:/config/services.xml
或classpath:/config/services.xml
,可是,請注意,你正在將應用程序的配置耦合到特定的絕對位置。一般更可取的作法是爲這些絕對位置保留一個間接的位置 — 例如,經過「${…}
」佔位符,這些佔位符在運行時對JVM系統屬性解析。
名稱空間自己提供導入指令特性,除了普通bean定義以外,Spring提供的XML名稱空間的選擇還提供了其餘配置特性 — 例如context
和util
名稱空間。
做爲外部化配置元數據的另外一個示例,bean定義也能夠用Spring的Groovy Bean Definition DSL表示,Grails框架中有這樣的定義,一般,這種配置存在於「.groovy
」文件中,其結構以下例所示:
beans { dataSource(BasicDataSource) { driverClassName = "org.hsqldb.jdbcDriver" url = "jdbc:hsqldb:mem:grailsDB" username = "sa" password = "" settings = [mynew:"setting"] } sessionFactory(SessionFactory) { dataSource = dataSource } myService(MyService) { nestedBean = { AnotherBean bean -> dataSource = dataSource } } }
這種配置風格在很大程度上等同於XML bean定義,甚至支持Spring的XML配置名稱空間,它還容許經過importBeans
指令導入XML bean定義文件。
ApplicationContext
是高級工廠的接口,該工廠可以維護不一樣bean及其依賴項的註冊表,經過使用方法T getBean(String name, Class<T> requiredType)
,能夠檢索bean的實例。
ApplicationContext
容許你讀取bean定義並訪問它們,以下面的示例所示:
// create and configure beans ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml"); // retrieve configured instance PetStoreService service = context.getBean("petStore", PetStoreService.class); // use configured instance List<String> userList = service.getUsernameList();
對於Groovy配置,引導看起來很是相似,它有一個不一樣的上下文實現類,它支持Groovy(但也理解XML bean定義),下面的示例顯示了Groovy配置:
ApplicationContext context = new GenericGroovyApplicationContext("services.groovy", "daos.groovy");
最靈活的變體是GenericApplicationContext
與reader委託相結合 — 例如,使用XmlBeanDefinitionReader
來處理XML文件,以下例所示:
GenericApplicationContext context = new GenericApplicationContext(); new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml"); context.refresh();
你還能夠對Groovy文件使用GroovyBeanDefinitionReader
,以下面的示例所示:
GenericApplicationContext context = new GenericApplicationContext(); new GroovyBeanDefinitionReader(context).loadBeanDefinitions("services.groovy", "daos.groovy"); context.refresh();
你能夠在相同的ApplicationContext
上混合和匹配這樣的reader委託,從不一樣的配置源讀取bean定義。
而後可使用getBean
檢索bean的實例,ApplicationContext
接口還有一些用於檢索bean的其餘方法,但在理想狀況下,應用程序代碼不該該使用它們。實際上,你的應用程序代碼應該徹底不調用getBean()
方法,所以徹底不依賴於Spring API。例如,Spring與web框架的集成爲各類web框架組件(如控制器和JSF管理的bean)提供了依賴注入,容許你經過元數據(如自動裝配註解)聲明對特定bean的依賴。