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 容器的根接口,是容器對外暴露的最基礎(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 // 支持父子容器層級結(jié)構(gòu)
├── ListableBeanFactory // 支持枚舉容器中所有 Bean
├── AutowireCapableBeanFactory // 支持自動(dòng)裝配(可用于非 Spring 管理對象)
└── 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、作用域注冊等。
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 提供對單例 Bean 的注冊和銷毀能力,是實(shí)現(xiàn)單例模式的關(guān)鍵接口。
4. AutowireCapableBeanFactory
允許對任意 Java 對象執(zhí)行 Spring 的依賴注入(即使該對象不是由 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定義的存儲
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
// Bean名稱的存儲順序
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 注冊表(Map<String, BeanDefinition>)
- 支持依賴解析、循環(huán)依賴處理(通過三級緩存)、作用域管理等完整功能
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. 其他輕量級實(shí)現(xiàn)
- StaticListableBeanFactory:手動(dòng)注冊 Bean 實(shí)例,適用于測試或簡單場景
- 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)依賴的核心邏輯(通過三級緩存)。
- 典型子類: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)(注冊表 + 所有能力)
到此這篇關(guān)于Spring中的BeanFactory類入門到精通的文章就介紹到這了,更多相關(guān)Spring BeanFactory類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java使用MulticastSocket實(shí)現(xiàn)組播
這篇文章主要為大家詳細(xì)介紹了java使用MulticastSocket實(shí)現(xiàn)組播,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Java高效實(shí)現(xiàn)更改Word文檔中文本顏色
在日常的自動(dòng)化文檔處理中,我們經(jīng)常會(huì)遇到需要對 Word 文檔內(nèi)容進(jìn)行編程修改的需求,本文將深入探討如何使用Java實(shí)現(xiàn) Word 文檔中文本顏色的更改,需要的可以了解下2025-09-09
springboot讀取application.yaml文件數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了springboot讀取application.yaml文件數(shù)據(jù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
Java中SSM+Shiro系統(tǒng)登錄驗(yàn)證碼的實(shí)現(xiàn)方法
這篇文章主要介紹了 SSM+Shiro系統(tǒng)登錄驗(yàn)證碼的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
SpringBoot3集成SpringSecurity+JWT的實(shí)現(xiàn)
本文詳解SpringBoot3整合SpringSecurity與JWT實(shí)現(xiàn)認(rèn)證授權(quán),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-07-07
java swing實(shí)現(xiàn)貪吃蛇雙人游戲
這篇文章主要為大家詳細(xì)介紹了java swing實(shí)現(xiàn)貪吃蛇雙人小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
SpringDataJpa的@Query注解報(bào)錯(cuò)的解決
這篇文章主要介紹了SpringDataJpa的@Query注解報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

