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