摘要:概述容器管理一個(gè)或多個(gè),這些是使用你提供給容器的配置元數(shù)據(jù)創(chuàng)建的例如,以定義的形式。在容器內(nèi)部,這些定義被表示為對(duì)象,其中包含其他信息以下元數(shù)據(jù)包限定的類(lèi)名通常,定義的實(shí)際實(shí)現(xiàn)類(lèi)。
Bean概述
Spring IoC容器管理一個(gè)或多個(gè)bean,這些bean是使用你提供給容器的配置元數(shù)據(jù)創(chuàng)建的(例如,以XML
在容器內(nèi)部,這些bean定義被表示為BeanDefinition對(duì)象,其中包含(其他信息)以下元數(shù)據(jù):
包限定的類(lèi)名:通常,定義bean的實(shí)際實(shí)現(xiàn)類(lèi)。
Bean行為配置元素,它聲明Bean在容器中的行為(作用域、生命周期回調(diào),等等)。
對(duì)bean執(zhí)行其工作所需的其他bean的引用,這些引用也稱(chēng)為協(xié)作者或依賴(lài)項(xiàng)。
要在新創(chuàng)建的對(duì)象中設(shè)置的其他配置設(shè)置 — 例如,池的大小限制或在管理連接池的bean中使用的連接數(shù)。
此元數(shù)據(jù)轉(zhuǎn)換為組成每個(gè)bean定義的一組屬性,下表描述了這些屬性:
屬性 | 解釋 |
---|---|
Class | 實(shí)例化Bean |
Name | 命名Bean |
Scope | Bean作用域 |
構(gòu)造函數(shù)參數(shù) | 依賴(lài)注入 |
屬性 | 依賴(lài)注入 |
自動(dòng)裝配模式 | 自動(dòng)裝配協(xié)作者 |
延遲初始化模式 | 延遲初始化Bean |
初始化方法 | 初始化回調(diào) |
銷(xiāo)毀方法 | 銷(xiāo)毀回調(diào) |
除了包含關(guān)于如何創(chuàng)建特定bean的信息的bean定義之外,ApplicationContext實(shí)現(xiàn)還允許注冊(cè)(由用戶(hù))在容器外部創(chuàng)建的現(xiàn)有對(duì)象,通過(guò)getBeanFactory()方法訪(fǎng)問(wèn)ApplicationContext的BeanFactory,該方法返回BeanFactory DefaultListableBeanFactory實(shí)現(xiàn)。DefaultListableBeanFactory通過(guò)registerSingleton(..)和registerBeanDefinition(..)方法支持這種注冊(cè),然而,典型的應(yīng)用程序只使用通過(guò)常規(guī)bean定義元數(shù)據(jù)定義的bean。
Bean元數(shù)據(jù)和手動(dòng)提供的單例實(shí)例需要盡早注冊(cè),以便容器在自動(dòng)裝配和其他內(nèi)省步驟中正確地推斷它們,雖然在某種程度上支持覆蓋現(xiàn)有的元數(shù)據(jù)和現(xiàn)有的單例實(shí)例,但是在運(yùn)行時(shí)注冊(cè)新bean(與對(duì)工廠(chǎng)的實(shí)時(shí)訪(fǎng)問(wèn)同時(shí)進(jìn)行)并不是官方支持的,并且可能會(huì)導(dǎo)致并發(fā)訪(fǎng)問(wèn)異常、bean容器中不一致的狀態(tài),或者兩者兼有。命名Bean
每個(gè)bean都有一個(gè)或多個(gè)標(biāo)識(shí)符,這些標(biāo)識(shí)符在承載bean的容器中必須是惟一的,bean通常只有一個(gè)標(biāo)識(shí)符,但是,如果需要多個(gè),則可以將額外的標(biāo)識(shí)符視為別名。
在基于XML的配置元數(shù)據(jù)中,可以使用id屬性、name屬性或兩者都使用來(lái)指定bean標(biāo)識(shí)符,id屬性允許你精確地指定一個(gè)id,通常,這些名稱(chēng)是字母數(shù)字("myBean"、"someService"等),但它們也可以包含特殊字符。如果希望為bean引入其他別名,還可以在name屬性中指定它們,以逗號(hào)(,)、分號(hào)(;)或空格分隔。作為歷史記錄,在Spring 3.1之前的版本中,id屬性被定義為xsd:ID類(lèi)型,這限制了可能的字符,從3.1開(kāi)始,它被定義為xsd:string類(lèi)型,注意,bean id惟一性仍然由容器執(zhí)行,但不再由XML解析器執(zhí)行。
你不需要為bean提供name或id,如果不顯式提供name或id,容器將為該bean生成唯一的名稱(chēng),但是,如果你希望通過(guò)名稱(chēng)引用該bean,通過(guò)使用ref元素或服務(wù)定位器樣式查找,你必須提供一個(gè)名稱(chēng),不提供名稱(chēng)的動(dòng)機(jī)與使用內(nèi)部bean和自動(dòng)裝配協(xié)作者有關(guān)。
Bean命名約定約定是在為bean命名時(shí)使用標(biāo)準(zhǔn)Java約定作為實(shí)例字段名,也就是說(shuō),bean名稱(chēng)以小寫(xiě)字母開(kāi)頭,并采用駝峰大小寫(xiě),此類(lèi)名稱(chēng)的示例包括accountManager、accountService、userDao、loginController等等。
一致地命名bean使你的配置更容易閱讀和理解,另外,如果你使用Spring AOP,當(dāng)你將advice應(yīng)用到一組按名稱(chēng)關(guān)聯(lián)的bean時(shí),它會(huì)提供很大的幫助。
使用類(lèi)路徑中的組件掃描,Spring按照前面描述的規(guī)則為未命名的組件生成bean名稱(chēng):本質(zhì)上,取簡(jiǎn)單的類(lèi)名并將其初始字符轉(zhuǎn)換為小寫(xiě),但是,在(不尋常的)特殊情況下,如果有多個(gè)字符,并且第一個(gè)和第二個(gè)字符都是大寫(xiě)的,則保留原來(lái)的大小寫(xiě),這些規(guī)則與java.beans.Introspector.decapitalize(Spring在這里使用)定義的規(guī)則相同。在Bean定義之外別名化Bean
在bean定義本身中,可以使用id屬性指定的最多一個(gè)名稱(chēng)和name屬性中任意數(shù)量的其他名稱(chēng)的組合,為bean提供多個(gè)名稱(chēng)。這些名稱(chēng)可以是相同bean的等價(jià)別名,在某些情況下非常有用,比如通過(guò)使用特定于該組件本身的bean名稱(chēng),讓?xiě)?yīng)用程序中的每個(gè)組件引用公共依賴(lài)項(xiàng)。
但是,指定實(shí)際定義bean的所有別名并不總是足夠的,有時(shí)需要為在其他地方定義的bean引入別名,在大型系統(tǒng)中,配置通常在每個(gè)子系統(tǒng)之間進(jìn)行劃分,每個(gè)子系統(tǒng)都有自己的一組對(duì)象定義,在基于XML的配置元數(shù)據(jù)中,可以使用
在這種情況下,在使用別名定義之后,名為fromName的bean(在同一個(gè)容器中)也可以稱(chēng)為toName。
例如,子系統(tǒng)A的配置元數(shù)據(jù)可以通過(guò)subsystemA-dataSource的名稱(chēng)引用數(shù)據(jù)源,子系統(tǒng)B的配置元數(shù)據(jù)可以通過(guò)subsystemB-dataSource的名稱(chēng)引用數(shù)據(jù)源。在組合使用這兩個(gè)子系統(tǒng)的主應(yīng)用程序時(shí),主應(yīng)用程序通過(guò)myApp-dataSource的名稱(chēng)引用數(shù)據(jù)源,要使所有三個(gè)名稱(chēng)都引用同一個(gè)對(duì)象,可以將以下別名定義添加到配置元數(shù)據(jù)中:
現(xiàn)在,每個(gè)組件和主應(yīng)用程序都可以通過(guò)惟一的名稱(chēng)引用數(shù)據(jù)源,并且保證不會(huì)與任何其他定義沖突(有效地創(chuàng)建名稱(chēng)空間),但是它們引用的是同一個(gè)bean。
Java配置實(shí)例化Bean如果使用Java配置,可以使用@Bean注解提供別名,有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn)使用@Bean注解。
bean定義本質(zhì)上是創(chuàng)建一個(gè)或多個(gè)對(duì)象的配方,當(dāng)被詢(xún)問(wèn)時(shí),容器會(huì)查看命名bean的配方,并使用該bean定義封裝的配置元數(shù)據(jù)來(lái)創(chuàng)建(或獲取)一個(gè)實(shí)際對(duì)象。
如果使用基于XML的配置元數(shù)據(jù),則要在
通常,在容器本身通過(guò)反射調(diào)用其構(gòu)造函數(shù)直接創(chuàng)建bean的情況下,指定要構(gòu)造的bean類(lèi),這有點(diǎn)類(lèi)似于使用new操作符的Java代碼。
要指定包含創(chuàng)建對(duì)象時(shí)調(diào)用的static工廠(chǎng)方法的實(shí)際類(lèi),在不太常見(jiàn)的情況下,容器調(diào)用類(lèi)上的static工廠(chǎng)方法來(lái)創(chuàng)建bean,從static工廠(chǎng)方法調(diào)用返回的對(duì)象類(lèi)型可以是同一個(gè)類(lèi),也可以完全是另一個(gè)類(lèi)。
內(nèi)部類(lèi)的名字使用構(gòu)造函數(shù)實(shí)例化如果要為static嵌套類(lèi)配置bean定義,必須使用嵌套類(lèi)的二進(jìn)制名稱(chēng)。
例如,如果你在com.example包中有一個(gè)名為SomeThing類(lèi),這個(gè)類(lèi)有一個(gè)static嵌套類(lèi)叫做OtherThing,bean定義上的class屬性的值是com.example.SomeThing$OtherThing。
注意,在名稱(chēng)中使用$字符將嵌套的類(lèi)名與外部類(lèi)名分隔開(kāi)。
當(dāng)你使用構(gòu)造函數(shù)方法創(chuàng)建bean時(shí),所有的普通類(lèi)都可以被Spring使用并與Spring兼容,也就是說(shuō),正在開(kāi)發(fā)的類(lèi)不需要實(shí)現(xiàn)任何特定的接口或以特定的方式編碼,只需指定bean類(lèi)就足夠了。但是,根據(jù)你為特定bean使用的IoC類(lèi)型,你可能需要一個(gè)默認(rèn)(空)構(gòu)造函數(shù)。
Spring IoC容器幾乎可以管理你希望它管理的任何類(lèi),它不僅限于管理真正的JavaBean,大多數(shù)Spring用戶(hù)更喜歡實(shí)際的JavaBean,它只有一個(gè)默認(rèn)(無(wú)參數(shù))構(gòu)造函數(shù),以及根據(jù)容器中的屬性建模的適當(dāng)?shù)?b>setter和getter。你還可以在容器中包含更多非bean樣式的類(lèi),例如,如果你需要使用完全不符合JavaBean規(guī)范的遺留連接池,Spring也可以很好的管理它。
使用基于XML的配置元數(shù)據(jù),你可以指定你的bean類(lèi)如下:
有關(guān)向構(gòu)造函數(shù)提供參數(shù)(如果需要)和在構(gòu)造對(duì)象之后設(shè)置對(duì)象實(shí)例屬性的機(jī)制的詳細(xì)信息,請(qǐng)參閱注入依賴(lài)項(xiàng)。
使用靜態(tài)工廠(chǎng)方法實(shí)例化在定義使用靜態(tài)工廠(chǎng)方法創(chuàng)建的bean時(shí),使用class屬性指定包含static工廠(chǎng)方法的類(lèi),使用factory-method屬性指定工廠(chǎng)方法本身的名稱(chēng)。你應(yīng)該能夠調(diào)用這個(gè)方法(帶有可選參數(shù),如后面所述)并返回一個(gè)活動(dòng)對(duì)象,隨后將其視為通過(guò)構(gòu)造函數(shù)創(chuàng)建的,這種bean定義的一個(gè)用途是在遺留代碼中調(diào)用static工廠(chǎng)。
下面的bean定義指定通過(guò)調(diào)用工廠(chǎng)方法創(chuàng)建bean,定義沒(méi)有指定返回對(duì)象的類(lèi)型(類(lèi)),只指定包含工廠(chǎng)方法的類(lèi),在本例中,createInstance()方法必須是一個(gè)靜態(tài)方法,下面的例子展示了如何指定工廠(chǎng)方法:
下面的例子展示了一個(gè)使用前面bean定義的類(lèi):
public class ClientService { private static ClientService clientService = new ClientService(); private ClientService() {} public static ClientService createInstance() { return clientService; } }
有關(guān)向工廠(chǎng)方法提供(可選)參數(shù)并在對(duì)象從工廠(chǎng)返回后設(shè)置對(duì)象實(shí)例屬性的機(jī)制的詳細(xì)信息,請(qǐng)參閱依賴(lài)項(xiàng)和配置。
使用實(shí)例工廠(chǎng)方法實(shí)例化與通過(guò)靜態(tài)工廠(chǎng)方法實(shí)例化類(lèi)似,使用實(shí)例工廠(chǎng)方法實(shí)例化將從容器中調(diào)用現(xiàn)有bean的非靜態(tài)方法來(lái)創(chuàng)建新bean,要使用此機(jī)制,請(qǐng)保留class屬性為空,并在factory-bean屬性中,在當(dāng)前(或父或祖先)容器中指定bean的名稱(chēng),該容器包含要調(diào)用來(lái)創(chuàng)建對(duì)象的實(shí)例方法,使用factory-method屬性設(shè)置工廠(chǎng)方法本身的名稱(chēng),下面的例子展示了如何配置這樣一個(gè)bean:
下面的例子顯示了相應(yīng)的Java類(lèi):
public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); public ClientService createClientServiceInstance() { return clientService; } }
一個(gè)工廠(chǎng)類(lèi)也可以包含多個(gè)工廠(chǎng)方法,如下例所示:
下面的例子顯示了相應(yīng)的Java類(lèi):
public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); private static AccountService accountService = new AccountServiceImpl(); public ClientService createClientServiceInstance() { return clientService; } public AccountService createAccountServiceInstance() { return accountService; } }
這種方法表明,工廠(chǎng)bean本身可以通過(guò)依賴(lài)項(xiàng)注入(DI)進(jìn)行管理和配置。
在Spring文檔中,“工廠(chǎng)bean”指的是在Spring容器中配置的bean,它通過(guò)實(shí)例或靜態(tài)工廠(chǎng)方法創(chuàng)建對(duì)象,相反,FactoryBean(注意大小寫(xiě))指的是特定于spring的FactoryBean。上一篇:容器概述
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75745.html
摘要:容器概述接口表示容器,負(fù)責(zé)實(shí)例化配置和組裝。基于的元數(shù)據(jù)不是惟一允許的配置元數(shù)據(jù)形式,容器本身與實(shí)際編寫(xiě)配置元數(shù)據(jù)的格式完全解耦,現(xiàn)在,許多開(kāi)發(fā)人員為他們的應(yīng)用程序選擇基于的配置。 容器概述 org.springframework.context.ApplicationContext接口表示Spring IoC容器,負(fù)責(zé)實(shí)例化、配置和組裝bean。容器通過(guò)讀取配置元數(shù)據(jù)獲取關(guān)于要實(shí)例化...
摘要:容器和介紹本章介紹了控制反轉(zhuǎn)原理的實(shí)現(xiàn),也稱(chēng)為依賴(lài)注入。在中,構(gòu)成應(yīng)用程序主干并由容器管理的對(duì)象稱(chēng)為,是由容器實(shí)例化組裝和管理的對(duì)象,否則,只是應(yīng)用程序中的許多對(duì)象之一,及其之間的依賴(lài)關(guān)系反映在容器使用的配置元數(shù)據(jù)中。 Spring IoC容器和bean介紹 本章介紹了控制反轉(zhuǎn)(IoC)原理的Spring Framework實(shí)現(xiàn),IoC也稱(chēng)為依賴(lài)注入(DI)。它是一個(gè)過(guò)程,對(duì)象僅通過(guò)構(gòu)...
摘要:除此之外,還為不同的應(yīng)用程序體系結(jié)構(gòu)提供了基礎(chǔ)支持,包括消息傳遞事務(wù)數(shù)據(jù)和持久性以及,它還包括基于的框架,以及與之并行的反應(yīng)性框架。還支持依賴(lài)項(xiàng)注入和公共注解規(guī)范,應(yīng)用程序開(kāi)發(fā)人員可以選擇使用這些規(guī)范,而不是提供的特定于的機(jī)制。 概述 Spring使創(chuàng)建Java企業(yè)應(yīng)用程序變得很容易,它提供了在企業(yè)環(huán)境中使用Java語(yǔ)言所需要的一切,支持Groovy和Kotlin作為JVM上的替代語(yǔ)言...
摘要:注解從版開(kāi)始,的緩存抽象完全支持標(biāo)準(zhǔn)注解和以及和。使用方法調(diào)用的結(jié)果更新緩存,要求將其作為使用注解的參數(shù)傳遞給它由于這種差異,允許在實(shí)際方法調(diào)用之前或之后更新緩存。非常相似,當(dāng)方法調(diào)用導(dǎo)致異常時(shí),支持條件驅(qū)逐。 JCache(JSR-107)注解 從4.1版開(kāi)始,Spring的緩存抽象完全支持JCache標(biāo)準(zhǔn)注解:@CacheResult、@CachePut、@CacheRemove和...
摘要:地址前面一個(gè)部分講解了如何使用工具來(lái)測(cè)試項(xiàng)目,現(xiàn)在我們講解如何使用工具來(lái)測(cè)試項(xiàng)目。所以我們可以利用這個(gè)特性來(lái)進(jìn)一步簡(jiǎn)化測(cè)試代碼。因?yàn)橹挥羞@樣才能夠在測(cè)試環(huán)境下發(fā)現(xiàn)生產(chǎn)環(huán)境的問(wèn)題,也避免出現(xiàn)一些因?yàn)榕渲貌煌瑢?dǎo)致的奇怪問(wèn)題。 Github地址 前面一個(gè)部分講解了如何使用Spring Testing工具來(lái)測(cè)試Spring項(xiàng)目,現(xiàn)在我們講解如何使用Spring Boot Testing工具來(lái)測(cè)...
閱讀 2548·2021-10-08 10:17
閱讀 1901·2021-09-06 15:02
閱讀 2595·2019-08-29 17:30
閱讀 2720·2019-08-29 13:24
閱讀 1578·2019-08-29 11:12
閱讀 3408·2019-08-28 17:52
閱讀 715·2019-08-26 11:30
閱讀 3654·2019-08-26 11:01