首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring核心區別:BeanFactory vs FactoryBean 深度解析

     編輯:Java 相關知識

Spring 框架中 BeanFactory 與 FactoryBean 僅一字之差,卻承擔完全不同的職責。本文從接口定義、核心方法、典型應用場景三個維度徹底釐清二者區別。

一、BeanFactory:IOC 容器的根接口

package org.springframework.beans.factory;

public interface BeanFactory {
    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String name) throws BeansException;
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    <T> T getBean(Class<T> requiredType) throws BeansException;
    Object getBean(String name, Object... args) throws BeansException;

    boolean containsBean(String name);
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    String[] getAliases(String name);
}
  • 定位:Spring IOC 容器的**最基礎規範**,定義了「獲取 Bean」的核心契約
  • 實現:DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext 等
  • 職責:管理 Bean 定義、實例化、生命周期、依賴注入、作用域控制

二、FactoryBean:生產 Bean 的工廠 Bean

package org.springframework.beans.factory;

public interface FactoryBean<T> {
    T getObject() throws Exception;
    Class<?> getObjectType();
    boolean isSingleton();
}
  • 定位:一個**特殊的 Bean**,實現該接口的類本身被容器管理,但 getBean() 返回的是 getObject() 產出的對象
  • 三大方法:
    1. getObject():返回真實業務對象,若 isSingleton()=true 則緩存單例
    2. getObjectType():聲明產出對象類型,供自動裝配類型匹配
    3. isSingleton():指示是否單例,false 表示每次請求新建
  • 命名約定:在容器中註冊名為 myBean 的 FactoryBean 實現類時:
    • getBean("myBean") → 返回 getObject() 結果
    • getBean("&myBean") → 返回 FactoryBean 實例本身

三、經典應用示例:簡化複雜對象配置

場景:Car 有多個屬性,XML 配置冗長。用 CarFactoryBean 封裝創建邏輯:

public class CarFactoryBean implements FactoryBean<Car> {
    private String carInfo; // "品牌,最高速度,價格"

    @Override public Car getObject() {
        Car car = new Car();
        String[] infos = carInfo.split(",");
        car.setBrand(infos[0]);
        car.setMaxSpeed(Integer.valueOf(infos[1]));
        car.setPrice(Double.valueOf(infos[2]));
        return car;
    }
    @Override public Class<Car> getObjectType() { return Car.class; }
    @Override public boolean isSingleton() { return false; }

    public String getCarInfo() { return carInfo; }
    public void setCarInfo(String carInfo) { this.carInfo = carInfo; }
}

XML 配置極簡:

<bean id="car" class="com.xxx.CarFactoryBean" p:carInfo="法拉利,400,2000000"/>

四、核心區別總結表

維度BeanFactoryFactoryBean
本質IOC 容器接口特殊的 Bean 實現類
角色管理所有 Bean 的註冊表負責創建**某一個**複雜 Bean
getBean() 返回直接返回 Bean 實例返回 getObject() 產出的對象
擴展點實現容器級功能(如掃描、後處理器)封裝單一對象的構建邏輯
典型實現DefaultListableBeanFactory、ApplicationContextPropertyPlaceholderConfigurer、LocalSessionFactoryBean、JndiObjectFactoryBean

五、記憶口訣

BeanFactory 是「大工廠」管理容器;
FactoryBean 是「小工廠」生產 Bean。

理解二者區別,有助於在擴展 Spring 時選擇正確的切入點:需要自定義容器行為時實現 BeanFactory 或 BeanFactoryPostProcessor;僅需封裝複雜對象創建邏輯時實現 FactoryBean。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved