網站首頁 編程語言 正文
BeanFactory
BeanFactory
是 Spring
容器的頂級接?,給具體的IOC容器的實現提供了規范。
BeanFactory
只是個接口,并不是IOC容器的具體實現.
而 Spring
的本質是一個 Bean
工廠( BeanFactory )或者說 Bean
容器,它按照我們的要求,生產我們需要的各種各樣的 Bean
,提供給我們使用。只是在生產 Bean
的過程中,需要解決 Bean
之間的依賴問題,才引入了依賴注入(DI)這種技術。也就是說依賴注入是 BeanFactory
生產 Bean
時為了解決 Bean
之間的依賴的一種技術而已。
BeanFactory 的實現
Spring
容器給出了很多種實現,如DefaultListableBeanFactory
、XmlBeanFactory
、ApplicationContext
等。而這些具體的容器都是實現了 BeanFactory
,再在其基礎之上附加了其他的功能。
DefaultListableBeanFactory
BeanFactory
接口體系的默認實現類,實現以上接口的功能,提供 BeanDefinition
的存儲 map
,Bean
對象對象的存儲 map
。
其中 Bean
對象實例的存儲 map
,定義在 FactoryBeanRegistrySupport
, FactoryBeanRegistrySupport
實現了 SingletonBeanRegistry
接口,而 DefaultListableBeanFactory
的基類 AbstractBeanFactory
,繼承于 FactoryBeanRegistrySupport
。
StaticListableBeanFactory
用于存儲給定的 bean 對象實例,不支持動態注冊功能,是 ListableBeanFactory
接口的簡單實現。
ApplicationContext
ApplicationContext
包含 BeanFactory
的所有功能,通常建議? BeanFactory
優先。
ApplicationContext
以?種更向?向框架的?式?作以及對上下?進?分層和實現繼承,ApplicationContext
包還提供了以下的功能:
-
MessageSource, 提供國際化的消息訪問。
-
資源訪問,如URL和?件
-
事件傳播
-
載?多個(有繼承關系)上下? ,使得每?個上下?都專注于?個特定的層次,?如應?的web 層;
BeanFactory
提供的?法及其簡單,僅提供了六種?法供客戶調?:源碼如下
String FACTORY_BEAN_PREFIX = "&";
? ?
//判斷??中是否包含給定名稱的bean定義,若有則返回true
? boolean containsBean(String beanName)
?
//返回給定名稱注冊的bean實例。根據bean的配置情況,如果是
singleton模式將返回?個共享實例,否則將返回?個新建的實例,如果沒有找到指定bean,該?法
可能會拋出異常
Object getBean(String)
?
//返回以給定名稱注冊的bean實例,并轉換為給定class類型
Class getType(String name) 返回給定名稱的bean的Class,如果沒有找到指定的bean實例,則排
除NoSuchBeanDefinitionException異常
Object getBean(String, Class)
?
//判斷給定名稱的bean定義是否為單例模式
boolean isSingleton(String)
?
//返回給定bean名稱的所有別名
String[] getAliases(String name)
而 FactoryBean
是干什么用的呢?
FactoryBean
?般情況下,Spring
通過反射機制利?<bean>
的 class
屬性指定實現類實例化 Bean
,在某些情況下,實例化 Bean
過程?較復雜,如果按照傳統的?式,則需要在 <bean>
中提供?量的配置信息。配置?式的靈活性是受限的,這時采?編碼的?式可能會得到?個簡單的?案。
Spring
為此提供了?個 org.springframework.bean.factory.FactoryBean
的??類接?,?戶可以通過實現該接?定制實例化Bean的邏輯。FactoryBean
接?對于 Spring
框架來說占?重要的地位,Spring
?身就提供了70多個 FactoryBean
的實現。它們隱藏了實例化?些復雜 Bean
的細節,給上層應?帶來了便利。從 Spring3.0
開始,FactoryBean
開始?持泛型,即接?聲明改為 FactoryBean<T>
的形式
以 Bean
結尾,表示它是?個 Bean
,不同于普通 Bean
的是:它是實現了 FactoryBean<T>
接?的 Bean
,根據該 Bean
的ID從BeanFactory
中獲取的實際上是 FactoryBean
的getObject()
返回的對象,?不是 FactoryBean
本身,如果要獲取 FactoryBean
對象,請在id前?加?個 &
符號來獲取。
例如??實現?個 FactoryBean
,功能:?來代理?個對象,對該對象的所有?法做?個攔截,在調?前后都輸出??LOG,模仿 ProxyFactoryBean
的功能。
FactoryBean
?個接?,當在IOC容器中的 Bean
實現了 FactoryBean
后,通過 getBean(StringBeanName)
獲取到的 Bean
對象并不是 FactoryBean
的實現類對象,?是這個實現類中的 getObject()
?法返回的對象。要想獲取 FactoryBean
的實現類,就要getBean(&BeanName)
,在 BeanName
之前加上&
.
在該接?中還定義了以下3個?法:
TgetObject():返回由FactoryBean創建的Bean實例,如果isSingleton()返回true,則該實例會放到Spring容器中單實例緩存池中;
?
booleanisSingleton():返回由FactoryBean創建的Bean實例的作?域是singleton還是
prototype;
?
ClassgetObjectType():返回FactoryBean創建的Bean類型。
總結
BeanFactory
是個 Factory
,也就是IOC容器或對象??,FactoryBean
是個 Bean
。在 Spring
中,所有的 Bean
都是由 BeanFactory
(也就是IOC容器)來進?管理的。但對 FactoryBean
??,這個 Bean
不是簡單的 Bean
,?是?個能?產或者修飾對象?成的?? Bean
,它的實現與設計模式中的??模式和修飾器模式類似。
原文鏈接:https://blog.csdn.net/tck001221/article/details/134068821
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-04-18 Taro編譯小程序的時候,就沒有錄音權限,沒有scope.record這個權限
- 2022-07-13 SpringCloud之Gateway統一網關
- 2022-07-19 Python數據分析?Numpy?的使用方法_python
- 2022-12-01 Rust實現AES加解密詳解_Rust語言
- 2022-05-05 碎片拼接技術恢復XenServer服務器SQL?Server數據庫數據_XenServer
- 2022-06-13 ASP.NET?Core中的Caching組件簡介_實用技巧
- 2022-05-22 C語言鏈接屬性的實踐應用_C 語言
- 2022-03-27 c++模擬實現string類詳情_C 語言
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支