BeanFactory 和 FactoryBean 虽然名字相似,但它们的作用完全不同:
BeanFactory
- 它是 Spring 框架最核心的接口,是 Spring IoC 容器的顶层接口
- 主要负责管理和生产 Bean 实例
- 定义了 getBean()、containsBean() 等管理 Bean 的基本方法
- ApplicationContext 是它的一个重要实现类,提供了更多企业级功能
举例说明 BeanFactory 的使用:
java
// 最基本的 BeanFactory 示例
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions("beans.xml");
MyBean myBean = factory.getBean("myBean", MyBean.class);
FactoryBean
- 它是一个能生产对象的工厂 Bean,是一个接口
- 主要用于封装复杂的 Bean 实例化逻辑
- 实现 FactoryBean 接口需要实现三个方法:getObject()、getObjectType() 和 isSingleton()
下面是一个 FactoryBean 的实现示例:
public class MyFactoryBean implements FactoryBean<MyComplexObject> {
@Override
public MyComplexObject getObject() throws Exception {
// 这里可以写复杂的创建逻辑
MyComplexObject object = new MyComplexObject();
// 进行一些复杂的配置
return object;
}
@Override
public Class<?> getObjectType() {
return MyComplexObject.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
使用 FactoryBean 的场景:
- 需要创建比较复杂的 Bean 实例
- Bean 的创建过程涉及到其他系统或服务
- 需要条件性地创建不同类型的 Bean
关键区别:
- BeanFactory 是容器,管理着 Spring Bean 的完整生命周期
- FactoryBean 是一个 Bean,但它是用来产生其他 Bean 的工厂
- 获取 FactoryBean 产生的对象时使用 getBean("beanName")
- 获取 FactoryBean 本身时使用 getBean("&beanName")