摘要:容器概述接口表示容器,負責實例化配置和組裝?;诘脑獢?shù)據(jù)不是惟一允許的配置元數(shù)據(jù)形式,容器本身與實際編寫配置元數(shù)據(jù)的格式完全解耦,現(xiàn)在,許多開發(fā)人員為他們的應(yīng)用程序選擇基于的配置。
容器概述
org.springframework.context.ApplicationContext接口表示Spring IoC容器,負責實例化、配置和組裝bean。容器通過讀取配置元數(shù)據(jù)獲取關(guān)于要實例化、配置和組裝哪些對象的指令,配置元數(shù)據(jù)用XML、Java注解或Java代碼表示,它允許你表達組成應(yīng)用程序的對象以及這些對象之間豐富的相互依賴關(guān)系。
Spring提供了ApplicationContext接口的幾個實現(xiàn),在獨立應(yīng)用程序中,通常創(chuàng)建ClassPathXmlApplicationContext或FileSystemXmlApplicationContext的實例。雖然XML一直是定義配置元數(shù)據(jù)的傳統(tǒng)格式,但是你可以通過提供少量XML配置來聲明支持這些額外的元數(shù)據(jù)格式,從而指示容器使用Java注解或代碼作為元數(shù)據(jù)格式。
在大多數(shù)應(yīng)用程序場景中,不需要顯式用戶代碼來實例化Spring IoC容器的一個或多個實例。例如,在web應(yīng)用程序場景中,在應(yīng)用程序的web.xml文件中使用8行左右的簡單樣例web描述符XML就足夠了(請參閱方便的web應(yīng)用程序的ApplicationContext實例化)。如果使用Spring Tool Suite(一個Eclipse支持的開發(fā)環(huán)境),只需單擊幾下鼠標或按鍵,就可以輕松創(chuàng)建這個樣板配置。
下圖顯示了Spring如何工作的高級別視圖,你的應(yīng)用程序類與配置元數(shù)據(jù)相結(jié)合,這樣,在創(chuàng)建并初始化ApplicationContext之后,你就擁有了一個完全配置的可執(zhí)行系統(tǒng)或應(yīng)用程序。
配置元數(shù)據(jù)如上圖所示,Spring IoC容器使用一種配置元數(shù)據(jù)形式,作為應(yīng)用程序開發(fā)人員,此配置元數(shù)據(jù)表示如何告訴Spring容器在應(yīng)用程序中實例化、配置和組裝對象。
配置元數(shù)據(jù)通常以簡單直觀的XML格式提供,本章的大部分內(nèi)容都使用這種格式來傳達Spring IoC容器的關(guān)鍵概念和特性。
基于XML的元數(shù)據(jù)不是惟一允許的配置元數(shù)據(jù)形式,Spring IoC容器本身與實際編寫配置元數(shù)據(jù)的格式完全解耦,現(xiàn)在,許多開發(fā)人員為他們的Spring應(yīng)用程序選擇基于java的配置。
有關(guān)在Spring容器中使用其他形式的元數(shù)據(jù)的信息,請參見:
基于注解的配置:Spring 2.5引入了對基于注解的配置元數(shù)據(jù)的支持。
基于java的配置:從Spring 3.0開始,Spring JavaConfig項目提供的許多特性成為Spring Framework核心的一部分,因此,你可以使用Java而不是XML文件來定義應(yīng)用程序類外部的bean,要使用這些新特性,請參見@Configuration、@Bean、@Import和@DependsOn注解。
Spring配置包含容器必須管理的至少一個bean定義,并且通常包含多個bean定義,基于XML的配置元數(shù)據(jù)將這些bean配置為頂級
這些bean定義對應(yīng)于組成應(yīng)用程序的實際對象,通常,你定義服務(wù)層對象、數(shù)據(jù)訪問對象(DAO)、表示對象(如Struts Action實例)、基礎(chǔ)設(shè)施對象(如Hibernate SessionFactories)、JMS Queues等等。通常,不會在容器中配置細粒度域?qū)ο?,因為通常由DAO和業(yè)務(wù)邏輯負責創(chuàng)建和加載域?qū)ο?。不過,你可以使用Spring與AspectJ的集成來配置在IoC容器控制之外創(chuàng)建的對象。
下面的例子展示了基于XML的配置元數(shù)據(jù)的基本結(jié)構(gòu):
id屬性是標識單個bean定義的字符串。
class屬性定義bean的類型并使用完全限定的類名。
id屬性的值引用協(xié)作對象,本例中沒有顯示用于引用協(xié)作對象的XML,有關(guān)更多信息,請參見依賴關(guān)系。
實例化一個容器提供給ApplicationContext構(gòu)造函數(shù)的位置路徑或路徑是資源字符串,允許容器從各種外部資源(如本地文件系統(tǒng)、Java CLASSPATH等)加載配置元數(shù)據(jù)。
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
在了解了Spring的IoC容器之后,你可能想了解更多關(guān)于Spring的Resource抽象的信息,它提供了一種方便的機制,可以從URI語法中定義的位置讀取InputStream,特別是,Resource路徑用于構(gòu)造應(yīng)用程序上下文。
下面的示例顯示了服務(wù)層對象(services.xml)配置文件:
下面的例子展示了數(shù)據(jù)訪問對象daos.xml文件:
在前面的示例中,服務(wù)層由PetStoreServiceImpl類和兩個數(shù)據(jù)訪問對象JpaAccountDao和JpaItemDao類型(基于JPA對象關(guān)系映射標準)組成,property name元素引用JavaBean屬性的名稱,ref元素引用另一個bean定義的名稱。id和ref元素之間的這種鏈接表示協(xié)作對象之間的依賴關(guān)系,有關(guān)配置對象依賴關(guān)系的詳細信息,請參見依賴關(guān)系。
組合基于XML的配置元數(shù)據(jù)讓bean定義跨多個XML文件是很有用的,通常,每個多帶帶的XML配置文件表示體系結(jié)構(gòu)中的邏輯層或模塊。
你可以使用應(yīng)用程序上下文構(gòu)造函數(shù)從所有這些XML片段加載bean定義,這個構(gòu)造函數(shù)接受多個Resource位置,如前一節(jié)所示。或者,使用一個或多個
在前面的示例中,外部bean定義從三個文件加載:services.xml、messageSource.xml和themeSource.xml,所有位置路徑都相對于執(zhí)行導(dǎo)入的定義文件,因此services.xml必須與執(zhí)行導(dǎo)入的文件位于相同的目錄或類路徑位置,而messageSource.xml和themeSource.xml必須位于導(dǎo)入文件位置下方的resources位置??梢钥吹?,前面的斜杠被忽略了,但是,由于這些路徑是相對的,所以最好不要使用斜杠,根據(jù)Spring Schema,導(dǎo)入的文件的內(nèi)容,包括頂層
它是可能的,但不推薦,在父目錄中引用文件使用一個相對"../“路徑,這樣做會創(chuàng)建對當前應(yīng)用程序外部文件的依賴。特別地,這個引用不推薦用于classpath:url(例如,classpath:../services.xml),其中運行時解析過程選擇“最近的”類路徑根,然后查看其父目錄,類路徑配置更改可能導(dǎo)致選擇不同的、不正確的目錄。你總是可以使用完全限定的資源位置,而不是相對路徑:例如,file:C:/config/services.xml或classpath:/config/services.xml,但是,請注意,你正在將應(yīng)用程序的配置耦合到特定的絕對位置。通常更可取的做法是為這些絕對位置保留一個間接的位置 — 例如,通過“${…?}”占位符,這些占位符在運行時對JVM系統(tǒng)屬性解析。
名稱空間本身提供導(dǎo)入指令特性,除了普通bean定義之外,Spring提供的XML名稱空間的選擇還提供了其他配置特性 — 例如context和util名稱空間。
Groovy Bean Definition DSL作為外部化配置元數(shù)據(jù)的另一個示例,bean定義也可以用Spring的Groovy Bean Definition DSL表示,Grails框架中有這樣的定義,通常,這種配置存在于“.groovy”文件中,其結(jié)構(gòu)如下例所示:
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指令導(dǎo)入XML bean定義文件。
使用容器ApplicationContext是高級工廠的接口,該工廠能夠維護不同bean及其依賴項的注冊表,通過使用方法T getBean(String name, Class
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 ListuserList = service.getUsernameList();
對于Groovy配置,引導(dǎo)看起來非常類似,它有一個不同的上下文實現(xiàn)類,它支持Groovy(但也理解XML bean定義),下面的示例顯示了Groovy配置:
ApplicationContext context = new GenericGroovyApplicationContext("services.groovy", "daos.groovy");
最靈活的變體是GenericApplicationContext與reader委托相結(jié)合 — 例如,使用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的其他方法,但在理想情況下,應(yīng)用程序代碼不應(yīng)該使用它們。實際上,你的應(yīng)用程序代碼應(yīng)該完全不調(diào)用getBean()方法,因此完全不依賴于Spring API。例如,Spring與web框架的集成為各種web框架組件(如控制器和JSF管理的bean)提供了依賴注入,允許你通過元數(shù)據(jù)(如自動裝配注解)聲明對特定bean的依賴。
上一篇:Spring IoC容器和bean介紹文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75750.html
摘要:除此之外,還為不同的應(yīng)用程序體系結(jié)構(gòu)提供了基礎(chǔ)支持,包括消息傳遞事務(wù)數(shù)據(jù)和持久性以及,它還包括基于的框架,以及與之并行的反應(yīng)性框架。還支持依賴項注入和公共注解規(guī)范,應(yīng)用程序開發(fā)人員可以選擇使用這些規(guī)范,而不是提供的特定于的機制。 概述 Spring使創(chuàng)建Java企業(yè)應(yīng)用程序變得很容易,它提供了在企業(yè)環(huán)境中使用Java語言所需要的一切,支持Groovy和Kotlin作為JVM上的替代語言...
摘要:概述容器管理一個或多個,這些是使用你提供給容器的配置元數(shù)據(jù)創(chuàng)建的例如,以定義的形式。在容器內(nèi)部,這些定義被表示為對象,其中包含其他信息以下元數(shù)據(jù)包限定的類名通常,定義的實際實現(xiàn)類。 Bean概述 Spring IoC容器管理一個或多個bean,這些bean是使用你提供給容器的配置元數(shù)據(jù)創(chuàng)建的(例如,以XML 定義的形式)。 在容器內(nèi)部,這些bean定義被表示為BeanDefinitio...
摘要:容器和介紹本章介紹了控制反轉(zhuǎn)原理的實現(xiàn),也稱為依賴注入。在中,構(gòu)成應(yīng)用程序主干并由容器管理的對象稱為,是由容器實例化組裝和管理的對象,否則,只是應(yīng)用程序中的許多對象之一,及其之間的依賴關(guān)系反映在容器使用的配置元數(shù)據(jù)中。 Spring IoC容器和bean介紹 本章介紹了控制反轉(zhuǎn)(IoC)原理的Spring Framework實現(xiàn),IoC也稱為依賴注入(DI)。它是一個過程,對象僅通過構(gòu)...
摘要:簡單明了,如果婚介給我們的人選不符合要求,我們就會拋出異常。的一個重點是在系統(tǒng)運行中,動態(tài)的向某個對象提供它所需要的其他對象。切點通過一個條件來匹配要攔截的類,這個條件稱為切點。 特點 1. IOC/依賴注入 IOC就是一個負責控制管理對象生命周期和對象間關(guān)系的容器。IOC讓程序員用關(guān)注怎么去創(chuàng)建對象,不必再為單實例模式類、屬性文件解析等這些很底層的需求編寫代碼,而是關(guān)注對象創(chuàng)建之后的...
摘要:經(jīng)過年時間的發(fā)展,到目前為止,最新穩(wěn)定版為版本。的發(fā)展剛出生的時候,引起了很多開源社區(qū)的關(guān)注,并且也有個人和企業(yè)開始嘗試使用。通過項目搭建過程來對比的差異和優(yōu)勢。當然它的作用不僅于此,后續(xù)會逐步揭開它的真實面目。而和就相當于當年的和的關(guān)系。 要了解Spring Boot的發(fā)展背景,還得從2004年Spring ...
閱讀 3326·2023-04-26 00:58
閱讀 1277·2021-09-22 16:04
閱讀 3323·2021-09-02 15:11
閱讀 1568·2019-08-30 15:55
閱讀 2348·2019-08-30 15:55
閱讀 3277·2019-08-23 18:41
閱讀 3470·2019-08-23 18:18
閱讀 2760·2019-08-23 17:53