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 實例(
getBean()) - 判斷容器是否包含某個 Bean(
containsBean()) - 獲取 Bean 的作用域、是否單例等元信息
- 采用懶加載策略(只有在首次調(diào)用 getBean() 時才會實例化 Bean)
值得注意的是,BeanFactory本身并不負(fù)責(zé) Bean 的創(chuàng)建過程,而是提供一個統(tǒng)一的訪問入口。真正的 Bean 創(chuàng)建、依賴注入、生命周期管理由其實現(xiàn)類完成。
二、BeanFactory 的接口體系結(jié)構(gòu)
BeanFactory接口繼承體系
BeanFactory
├── HierarchicalBeanFactory // 支持父子容器層級結(jié)構(gòu)
├── ListableBeanFactory // 支持枚舉容器中所有 Bean
├── AutowireCapableBeanFactory // 支持自動裝配(可用于非 Spring 管理對象)
└── ConfigurableBeanFactory // 支持配置(如設(shè)置父工廠、類加載器等)
└── ConfigurableListableBeanFactory
1. ListableBeanFactory
提供按類型或名稱獲取多個Bean的方法,可以將容器中的Bean全部取出
public interface ListableBeanFactory extends BeanFactory {
// 按類型獲取所有Bean
String[] getBeanNamesForType(Class<?> type);
// 按類型獲取所有Bean,包含子類
String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
// 按類型獲取所有Bean實例
<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è)置臨時類加載器
void setTempClassLoader(ClassLoader tempClassLoader);
// 設(shè)置Bean后處理器
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
// 銷毀單例Bean
void destroySingletons();
}SingletonBeanRegistry 提供對單例 Bean 的注冊和銷毀能力,是實現(xiàn)單例模式的關(guān)鍵接口。
4. AutowireCapableBeanFactory
允許對任意 Java 對象執(zhí)行 Spring 的依賴注入(即使該對象不是由 Spring 容器創(chuàng)建的)。常用于集成第三方庫。
public interface AutowireCapableBeanFactory extends BeanFactory {
// 創(chuàng)建Bean實例
Object createBean(Class<?> beanClass) throws BeansException;
// 自動裝配Bean屬性
void autowireBean(Object existingBean) throws BeansException;
// 應(yīng)用Bean后處理器
Object initializeBean(Object existingBean, String beanName) throws BeansException;
// 銷毀Bean
void destroyBean(Object existingBean);
}三、BeanFactory 的核心實現(xiàn)體系
雖然 BeanFactory 是接口,但 Spring 提供了多個實現(xiàn)類,其中最重要的是:
1. DefaultListableBeanFactory
這是BeanFactory最常用的實現(xiàn)類,實現(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);
// 省略其他實現(xiàn)...
}這是Spring 內(nèi)部最核心、最完整的BeanFactory 實現(xiàn),也是ApplicationContext(如 ClassPathXmlApplicationContext)內(nèi)部實際使用的工廠。
- 內(nèi)部維護 BeanDefinition 注冊表(Map<String, BeanDefinition>)
- 支持依賴解析、循環(huán)依賴處理(通過三級緩存)、作用域管理等完整功能
2. XmlBeanFactory(已過時)
基于XML配置文件的Bean工廠實現(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,因其提供了更完整的生命周期管理和事件機制。
3. 其他輕量級實現(xiàn)
- StaticListableBeanFactory:手動注冊 Bean 實例,適用于測試或簡單場景
- SimpleJndiBeanFactory:從 JNDI 查找 Bean(主要用于傳統(tǒng) Java EE 環(huán)境)
另外還有兩個抽象實現(xiàn)類
AbstractBeanFactory
關(guān)鍵職責(zé):
- 實現(xiàn)了單例Bean的緩存機制
- 實現(xiàn)了 ConfigurableBeanFactory 接口的大部分通用邏輯。
- 提供了 getBean() 方法的主干流程(模板方法模式),但將具體實例化、依賴解析等委托給子類。
- 重要方法:
public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
protected <T> T doGetBean(...) { ... } // 模板方法,子類需實現(xiàn) createBean()
AbstractAutowireCapableBeanFactory
定位:在 AbstractBeanFactory 基礎(chǔ)上,增加了 自動裝配(Autowiring) 和 Bean 生命周期管理 能力。
關(guān)鍵職責(zé):
- 實現(xiàn)了AutowireCapableBeanFactory 接口
- 提供完整的 Bean 創(chuàng)建流程:實例化 → 屬性填充 → 初始化邏輯執(zhí)行(創(chuàng)建Bean的核心三個步驟)。
- 實現(xiàn)循環(huán)依賴的核心邏輯(通過三級緩存)。
- 典型子類:DefaultListableBeanFactory
- 核心方法
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
四、小結(jié)
- BeanFactory 是規(guī)范(接口契約)
- AbstractBeanFactory 定義了流程(模板方法)
- AbstractAutowireCapableBeanFactory 提供了核心實現(xiàn)骨架(Bean 創(chuàng)建、依賴注入、生命周期)
- DefaultListableBeanFactory 是功能完整的最終實現(xiàn)(注冊表 + 所有能力)
到此這篇關(guān)于Spring中的BeanFactory類入門到精通的文章就介紹到這了,更多相關(guān)Spring BeanFactory類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 中的橫切邏輯統(tǒng)一治理方案
攔截器是Spring框架提供的核心功能之一,核心用于統(tǒng)一攔截用戶的請求,文章主要介紹了Spring框架中的攔截器、統(tǒng)一數(shù)據(jù)返回格式和統(tǒng)一異常處理,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2026-02-02
SpringCloud使用Feign實現(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)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
基于Java SSM框架開發(fā)圖書借閱系統(tǒng)源代碼
本文給大家介紹了基于Java SSM框架開發(fā)圖書借閱系統(tǒng),開發(fā)環(huán)境基于idea2020+mysql數(shù)據(jù)庫,前端框架使用bootstrap4框架,完美了實現(xiàn)圖書借閱系統(tǒng),喜歡的朋友快來體驗吧2021-05-05

