Spring 框架中 BeanFactory 與 FactoryBean 僅一字之差,卻承擔完全不同的職責。本文從接口定義、核心方法、典型應用場景三個維度徹底釐清二者區別。
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);
}
DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext 等package org.springframework.beans.factory;
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
getBean() 返回的是 getObject() 產出的對象getObject():返回真實業務對象,若 isSingleton()=true 則緩存單例getObjectType():聲明產出對象類型,供自動裝配類型匹配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"/>
| 維度 | BeanFactory | FactoryBean |
|---|---|---|
| 本質 | IOC 容器接口 | 特殊的 Bean 實現類 |
| 角色 | 管理所有 Bean 的註冊表 | 負責創建**某一個**複雜 Bean |
| getBean() 返回 | 直接返回 Bean 實例 | 返回 getObject() 產出的對象 |
| 擴展點 | 實現容器級功能(如掃描、後處理器) | 封裝單一對象的構建邏輯 |
| 典型實現 | DefaultListableBeanFactory、ApplicationContext | PropertyPlaceholderConfigurer、LocalSessionFactoryBean、JndiObjectFactoryBean |
BeanFactory 是「大工廠」管理容器;
FactoryBean 是「小工廠」生產 Bean。
理解二者區別,有助於在擴展 Spring 時選擇正確的切入點:需要自定義容器行為時實現 BeanFactory 或 BeanFactoryPostProcessor;僅需封裝複雜對象創建邏輯時實現 FactoryBean。