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