Spring中的BeanFactory類入門到精通
一、BeanFactory 是什么?
BeanFactory 是 Spring 框架中最頂層的 IoC(Inversion of Control)容器接口,位于 org.springframework.beans.factory 包下。它是 Spring 管理 Bean 生命周期、依賴注入和配置元數(shù)據(jù)的核心入口。
根據(jù) Spring 官方 Javadoc 的描述:
The root interface for accessing a Spring bean container. This is the basic client view of a bean container;
直譯過來就是:BeanFactory 是訪問 Spring Bean 容器的根接口,是容器對(duì)外暴露的最基礎(chǔ)視圖。
Bean的源碼:
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}從這些方法可以看出,其核心職責(zé)包括:
- 根據(jù)名稱或類型獲取 Bean 實(shí)例(
getBean()) - 判斷容器是否包含某個(gè) Bean(
containsBean()) - 獲取 Bean 的作用域、是否單例等元信息
- 采用懶加載策略(只有在首次調(diào)用 getBean() 時(shí)才會(huì)實(shí)例化 Bean)
值得注意的是,BeanFactory本身并不負(fù)責(zé) Bean 的創(chuàng)建過程,而是提供一個(gè)統(tǒng)一的訪問入口。真正的 Bean 創(chuàng)建、依賴注入、生命周期管理由其實(shí)現(xiàn)類完成。
二、BeanFactory 的接口體系結(jié)構(gòu)
BeanFactory接口繼承體系
BeanFactory
├── HierarchicalBeanFactory // 支持父子容器層級(jí)結(jié)構(gòu)
├── ListableBeanFactory // 支持枚舉容器中所有 Bean
├── AutowireCapableBeanFactory // 支持自動(dòng)裝配(可用于非 Spring 管理對(duì)象)
└── ConfigurableBeanFactory // 支持配置(如設(shè)置父工廠、類加載器等)
└── ConfigurableListableBeanFactory
1. ListableBeanFactory
提供按類型或名稱獲取多個(gè)Bean的方法,可以將容器中的Bean全部取出
public interface ListableBeanFactory extends BeanFactory {
// 按類型獲取所有Bean
String[] getBeanNamesForType(Class<?> type);
// 按類型獲取所有Bean,包含子類
String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
// 按類型獲取所有Bean實(shí)例
<T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
// 獲取所有Bean定義的名稱
String[] getBeanDefinitionNames();
// 獲取Bean定義的數(shù)量
int getBeanDefinitionCount();
}2. HierarchicalBeanFactory
支持分層Bean工廠,允許有父工廠:
public interface HierarchicalBeanFactory extends BeanFactory {
// 獲取父工廠
BeanFactory getParentBeanFactory();
// 判斷是否包含指定名稱的Bean(包括父工廠)
boolean containsLocalBean(String name);
}3. ConfigurableBeanFactory
提供配置功能:如設(shè)置 ClassLoader、BeanPostProcessor、作用域注冊(cè)等。
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
// 設(shè)置Bean類加載器
void setBeanClassLoader(ClassLoader beanClassLoader);
// 設(shè)置臨時(shí)類加載器
void setTempClassLoader(ClassLoader tempClassLoader);
// 設(shè)置Bean后處理器
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
// 銷毀單例Bean
void destroySingletons();
}SingletonBeanRegistry 提供對(duì)單例 Bean 的注冊(cè)和銷毀能力,是實(shí)現(xiàn)單例模式的關(guān)鍵接口。
4. AutowireCapableBeanFactory
允許對(duì)任意 Java 對(duì)象執(zhí)行 Spring 的依賴注入(即使該對(duì)象不是由 Spring 容器創(chuàng)建的)。常用于集成第三方庫。
public interface AutowireCapableBeanFactory extends BeanFactory {
// 創(chuàng)建Bean實(shí)例
Object createBean(Class<?> beanClass) throws BeansException;
// 自動(dòng)裝配Bean屬性
void autowireBean(Object existingBean) throws BeansException;
// 應(yīng)用Bean后處理器
Object initializeBean(Object existingBean, String beanName) throws BeansException;
// 銷毀Bean
void destroyBean(Object existingBean);
}三、BeanFactory 的核心實(shí)現(xiàn)體系
雖然 BeanFactory 是接口,但 Spring 提供了多個(gè)實(shí)現(xiàn)類,其中最重要的是:
1. DefaultListableBeanFactory
這是BeanFactory最常用的實(shí)現(xiàn)類,實(shí)現(xiàn)了ListableBeanFactory、ConfigurableBeanFactory等接口:
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
// Bean定義的存儲(chǔ)
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
// Bean名稱的存儲(chǔ)順序
private final List<String> beanDefinitionNames = new ArrayList<>(256);
// 省略其他實(shí)現(xiàn)...
}這是Spring 內(nèi)部最核心、最完整的BeanFactory 實(shí)現(xiàn),也是ApplicationContext(如 ClassPathXmlApplicationContext)內(nèi)部實(shí)際使用的工廠。
- 內(nèi)部維護(hù) BeanDefinition 注冊(cè)表(Map<String, BeanDefinition>)
- 支持依賴解析、循環(huán)依賴處理(通過三級(jí)緩存)、作用域管理等完整功能
2. XmlBeanFactory(已過時(shí))
基于XML配置文件的Bean工廠實(shí)現(xiàn),現(xiàn)在已被ClassPathXmlApplicationContext等替代:
public class XmlBeanFactory extends DefaultListableBeanFactory {
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
}
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
}官方建議改用ClassPathXmlApplicationContext,因其提供了更完整的生命周期管理和事件機(jī)制。
3. 其他輕量級(jí)實(shí)現(xiàn)
- StaticListableBeanFactory:手動(dòng)注冊(cè) Bean 實(shí)例,適用于測(cè)試或簡(jiǎn)單場(chǎng)景
- SimpleJndiBeanFactory:從 JNDI 查找 Bean(主要用于傳統(tǒng) Java EE 環(huán)境)
另外還有兩個(gè)抽象實(shí)現(xiàn)類
AbstractBeanFactory
關(guān)鍵職責(zé):
- 實(shí)現(xiàn)了單例Bean的緩存機(jī)制
- 實(shí)現(xiàn)了 ConfigurableBeanFactory 接口的大部分通用邏輯。
- 提供了 getBean() 方法的主干流程(模板方法模式),但將具體實(shí)例化、依賴解析等委托給子類。
- 重要方法:
public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
protected <T> T doGetBean(...) { ... } // 模板方法,子類需實(shí)現(xiàn) createBean()
AbstractAutowireCapableBeanFactory
定位:在 AbstractBeanFactory 基礎(chǔ)上,增加了 自動(dòng)裝配(Autowiring) 和 Bean 生命周期管理 能力。
關(guān)鍵職責(zé):
- 實(shí)現(xiàn)了AutowireCapableBeanFactory 接口
- 提供完整的 Bean 創(chuàng)建流程:實(shí)例化 → 屬性填充 → 初始化邏輯執(zhí)行(創(chuàng)建Bean的核心三個(gè)步驟)。
- 實(shí)現(xiàn)循環(huán)依賴的核心邏輯(通過三級(jí)緩存)。
- 典型子類:DefaultListableBeanFactory
- 核心方法
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
四、小結(jié)
- BeanFactory 是規(guī)范(接口契約)
- AbstractBeanFactory 定義了流程(模板方法)
- AbstractAutowireCapableBeanFactory 提供了核心實(shí)現(xiàn)骨架(Bean 創(chuàng)建、依賴注入、生命周期)
- DefaultListableBeanFactory 是功能完整的最終實(shí)現(xiàn)(注冊(cè)表 + 所有能力)
到此這篇關(guān)于Spring中的BeanFactory類入門到精通的文章就介紹到這了,更多相關(guān)Spring BeanFactory類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 中的橫切邏輯統(tǒng)一治理方案
攔截器是Spring框架提供的核心功能之一,核心用于統(tǒng)一攔截用戶的請(qǐng)求,文章主要介紹了Spring框架中的攔截器、統(tǒng)一數(shù)據(jù)返回格式和統(tǒng)一異常處理,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2026-02-02
SpringCloud使用Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用流程詳細(xì)介紹
OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開發(fā),讓開發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠(yuǎn)程調(diào)用,都像調(diào)用本地方法一樣完成2023-02-02
IDEA中的yml文件與properties互相轉(zhuǎn)換
這篇文章主要介紹了IDEA中的yml文件與properties互相轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
使用javax.sound實(shí)現(xiàn)簡(jiǎn)單音頻播放
這篇文章主要為大家詳細(xì)介紹了使用javax.sound實(shí)現(xiàn)簡(jiǎn)單音頻播放,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
基于Java SSM框架開發(fā)圖書借閱系統(tǒng)源代碼
本文給大家介紹了基于Java SSM框架開發(fā)圖書借閱系統(tǒng),開發(fā)環(huán)境基于idea2020+mysql數(shù)據(jù)庫,前端框架使用bootstrap4框架,完美了實(shí)現(xiàn)圖書借閱系統(tǒng),喜歡的朋友快來體驗(yàn)吧2021-05-05

