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