Spring Framework 參考文檔(容器概述)

容器概述

org.springframework.context.ApplicationContext接口表示Spring IoC容器,負責實例化、配置和組裝bean。容器經過讀取配置元數據獲取關於要實例化、配置和組裝哪些對象的指令,配置元數據用XML、Java註解或Java代碼表示,它容許你表達組成應用程序的對象以及這些對象之間豐富的相互依賴關係。html

Spring提供了ApplicationContext接口的幾個實現,在獨立應用程序中,一般建立ClassPathXmlApplicationContextFileSystemXmlApplicationContext的實例。雖然XML一直是定義配置元數據的傳統格式,可是你能夠經過提供少許XML配置來聲明支持這些額外的元數據格式,從而指示容器使用Java註解或代碼做爲元數據格式。java

在大多數應用程序場景中,不須要顯式用戶代碼來實例化Spring IoC容器的一個或多個實例。例如,在web應用程序場景中,在應用程序的web.xml文件中使用8行左右的簡單樣例web描述符XML就足夠了(請參閱方便的web應用程序的ApplicationContext實例化)。若是使用Spring Tool Suite(一個Eclipse支持的開發環境),只需單擊幾下鼠標或按鍵,就能夠輕鬆建立這個樣板配置。web

下圖顯示了Spring如何工做的高級別視圖,你的應用程序類與配置元數據相結合,這樣,在建立並初始化ApplicationContext以後,你就擁有了一個徹底配置的可執行系統或應用程序。spring

container-magic.png

配置元數據

如上圖所示,Spring IoC容器使用一種配置元數據形式,做爲應用程序開發人員,此配置元數據表示如何告訴Spring容器在應用程序中實例化、配置和組裝對象。sql

配置元數據一般以簡單直觀的XML格式提供,本章的大部份內容都使用這種格式來傳達Spring IoC容器的關鍵概念和特性。segmentfault

基於XML的元數據不是唯一容許的配置元數據形式,Spring IoC容器自己與實際編寫配置元數據的格式徹底解耦,如今,許多開發人員爲他們的Spring應用程序選擇基於java的配置。

有關在Spring容器中使用其餘形式的元數據的信息,請參見:api

  • 基於註解的配置:Spring 2.5引入了對基於註解的配置元數據的支持。
  • 基於java的配置:從Spring 3.0開始,Spring JavaConfig項目提供的許多特性成爲Spring Framework核心的一部分,所以,你可使用Java而不是XML文件來定義應用程序類外部的bean,要使用這些新特性,請參見@Configuration@Bean@Import@DependsOn註解。

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類和兩個數據訪問對象JpaAccountDaoJpaItemDao類型(基於JPA對象關係映射標準)組成,property name元素引用JavaBean屬性的名稱,ref元素引用另外一個bean定義的名稱。idref元素之間的這種連接表示協做對象之間的依賴關係,有關配置對象依賴關係的詳細信息,請參見依賴關係。

組合基於XML的配置元數據

讓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.xmlmessageSource.xmlthemeSource.xml,全部位置路徑都相對於執行導入的定義文件,所以services.xml必須與執行導入的文件位於相同的目錄或類路徑位置,而messageSource.xmlthemeSource.xml必須位於導入文件位置下方的resources位置。能夠看到,前面的斜槓被忽略了,可是,因爲這些路徑是相對的,因此最好不要使用斜槓,根據Spring Schema,導入的文件的內容,包括頂層<beans/>元素,必須是有效的XML bean定義。

它是可能的,但不推薦,在父目錄中引用文件使用一個相對" ../「路徑,這樣作會建立對當前應用程序外部文件的依賴。特別地,這個引用不推薦用於 classpath:url(例如, classpath:../services.xml),其中運行時解析過程選擇「最近的」類路徑根,而後查看其父目錄,類路徑配置更改可能致使選擇不一樣的、不正確的目錄。

你老是可使用徹底限定的資源位置,而不是相對路徑:例如,file:C:/config/services.xmlclasspath:/config/services.xml,可是,請注意,你正在將應用程序的配置耦合到特定的絕對位置。一般更可取的作法是爲這些絕對位置保留一個間接的位置 — 例如,經過「${…​}」佔位符,這些佔位符在運行時對JVM系統屬性解析。

名稱空間自己提供導入指令特性,除了普通bean定義以外,Spring提供的XML名稱空間的選擇還提供了其餘配置特性 — 例如contextutil名稱空間。

Groovy Bean Definition DSL

做爲外部化配置元數據的另外一個示例,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的依賴。


上一篇:Spring IoC容器和bean介紹

相關文章
相關標籤/搜索