Spring BeanFactory 和 FactoryBean,有什么區(qū)別?
在 Spring框架中,BeanFactory是什么?FactoryBean又是什么?兩個(gè)很相近的單詞,它們之間有什么關(guān)聯(lián)呢?這篇文章,我們來聊一聊。

1. BeanFactory
BeanFactory是 Spring的核心接口之一,代表了 Spring的 IoC(控制反轉(zhuǎn))容器。它負(fù)責(zé)管理和配置應(yīng)用程序中的 Bean,包括 Bean的生命周期、依賴關(guān)系和作用域。
如下圖是BeanFactory的源碼:


BeanFactory的主要方法:
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;
    @Nullable
    Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
    String[] getAliases(String name);
}BeanFactory的主要特點(diǎn):
- 基礎(chǔ)容器: BeanFactory是Spring容器的最基礎(chǔ)實(shí)現(xiàn),提供了最基本的Bean管理功能。
 - 延遲加載(Lazy Initialization): 默認(rèn)情況下,BeanFactory在請(qǐng)求Bean時(shí)才會(huì)創(chuàng)建它,因此適合資源占用較少的場景。
 - 輕量級(jí): 由于功能相對(duì)簡單,BeanFactory適用于資源受限的環(huán)境,如移動(dòng)設(shè)備或嵌入式系統(tǒng)。
 - 核心接口: 它是多個(gè)Spring容器實(shí)現(xiàn)(如XmlBeanFactory、ClasspathXmlApplicationContext等)的父接口。
 
使用示例:
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
MyBean myBean = beanFactory.getBean("myBean", MyBean.class);在實(shí)際開發(fā)中,ApplicationContext(BeanFactory的子接口)更常用,因?yàn)樗峁┝烁嗟墓δ埽缡录鞑?、國際化支持和 Bean后處理等。
2. FactoryBean
FactoryBean也是 Spring 提供的一個(gè)接口,用于自定義復(fù)雜對(duì)象的創(chuàng)建邏輯。通過實(shí)現(xiàn)FactoryBean接口,開發(fā)者可以控制 Bean實(shí)例的創(chuàng)建過程,動(dòng)態(tài)生成 Bean或在創(chuàng)建過程中進(jìn)行額外的處理。
如下圖是FactoryBean的源碼:

FactoryBean的主要特點(diǎn):
- 自定義實(shí)例化邏輯: 允許開發(fā)者定義復(fù)雜的實(shí)例化過程,生成特定類型的Bean。
 - 代理對(duì)象創(chuàng)建: 常用于創(chuàng)建代理對(duì)象,如AOP中的代理。
 - 返回其他Bean: FactoryBean的getObject()方法可以返回任何對(duì)象,而不僅僅是FactoryBean本身。
 
FactoryBean的關(guān)鍵方法:
- Object getObject() throws Exception;:返回由FactoryBean創(chuàng)建的對(duì)象。
 - Class<?> getObjectType();:返回創(chuàng)建對(duì)象的類型。
 - boolean isSingleton();:指示由getObject()創(chuàng)建的對(duì)象是否為單例。
 
使用示例:
如下示例,假設(shè)需要?jiǎng)?chuàng)建一個(gè)復(fù)雜的服務(wù)對(duì)象,可以通過實(shí)現(xiàn)FactoryBean來定制實(shí)例化過程。
public class MyServiceFactoryBean implements FactoryBean<MyService> {
    @Override
    public MyService getObject() throws Exception {
        // 自定義創(chuàng)建邏輯
        MyService service = new MyService();
        service.initialize();
        return service;
    }
    @Override
    public Class<?> getObjectType() {
        return MyService.class;
    }
    @Override
    public boolean isSingleton() {
        returntrue;
    }
}在Spring配置中聲明:
<bean id="myService" class="com.example.MyServiceFactoryBean"/>獲取MyService實(shí)例:
MyService myService = context.getBean("myService", MyService.class);3. 兩者區(qū)別
特性  | BeanFactory  | FactoryBean  | 
定義  | Spring IoC容器的核心接口,用于管理和配置應(yīng)用程序中的Bean。  | 一個(gè)Spring接口,允許開發(fā)者自定義Bean的創(chuàng)建邏輯,作為Bean的工廠。  | 
角色  | 作為容器,負(fù)責(zé)加載、配置和管理所有的Bean。  | 作為Bean的一種特殊類型,用于生成其他Bean實(shí)例。  | 
功能  | 提供Bean的基本管理功能,如依賴注入、生命周期管理等。  | 提供自定義的Bean實(shí)例化過程,可以創(chuàng)建復(fù)雜或動(dòng)態(tài)的Bean對(duì)象。  | 
使用場景  | 適用于基本的Bean管理需求,但在實(shí)際開發(fā)中通常使用更高級(jí)的ApplicationContext。  | 需要復(fù)雜對(duì)象創(chuàng)建邏輯、創(chuàng)建代理對(duì)象或動(dòng)態(tài)生成Bean時(shí)使用。  | 
實(shí)例類型  | 通常通過Spring提供的具體實(shí)現(xiàn)類,如XmlBeanFactory(已過時(shí))、ClassPathXmlApplicationContext等。  | 任意實(shí)現(xiàn)了FactoryBean接口的類。  | 
獲取Bean實(shí)例  | 直接通過容器的getBean方法獲取Bean實(shí)例。  | 通過getObject()方法由容器間接獲取Bean實(shí)例。意味著在Spring配置中聲明的FactoryBean會(huì)返回其getObject()方法所生成的對(duì)象,而不是FactoryBean本身。  | 
4. 總結(jié)
本文,我們了解了BeanFactory和FactoryBean的基本概念,了解了它們之間的關(guān)系,以及在實(shí)際應(yīng)用中的應(yīng)用場景。
BeanFactory 是Spring IoC容器的核心接口,負(fù)責(zé)管理和提供Bean實(shí)例,是整個(gè)Bean管理機(jī)制的基礎(chǔ)。
FactoryBean 則是一個(gè)用于定制 Bean創(chuàng)建過程的機(jī)制,通過實(shí)現(xiàn)該接口,可以控制 Bean的實(shí)例化、配置甚至返回不同類型的對(duì)象。















 
 
 

















 
 
 
 