BeanFactory和FactoryBean有什么本质区别?
摘要:要彻底分清 BeanFactory 和 FactoryBean,核心是抓住名称相似但定位完全不同:BeanFactory 是 IoC 容器的「顶层接口」,负责管理所有 Bean;FactoryBean 是创建复杂 Bean 的「工厂接口」,
要彻底分清 BeanFactory 和 FactoryBean,核心是抓住名称相似但定位完全不同:BeanFactory 是 IoC 容器的「顶层接口」,负责管理所有 Bean;FactoryBean 是创建复杂 Bean 的「工厂接口」,是单个 Bean 的「自定义创建工具」。
一、先看核心定位(一句话区分)
特性
BeanFactory
FactoryBean
核心角色
IoC 容器(管理者)
Bean 工厂(生产者)
作用范围
管理容器中所有 Bean 的生命周期
只负责创建某一个特定的 Bean
核心方法
getBean(String name)、containsBean() 等
getObject()(创建 Bean)、getObjectType()(返回 Bean 类型)
使用目的
定义容器的基本行为(获取/判断 Bean)
自定义 Bean 的创建逻辑(解决复杂 Bean 实例化问题)
二、详细拆解
1. BeanFactory:IoC 容器的「根接口」
BeanFactory 是 Spring IoC 容器的最底层核心接口,所有 Spring 容器(比如 ApplicationContext)都实现了这个接口,它定义了 IoC 容器的基础能力。
核心特点:
容器的本质:它不是一个具体的类,而是「容器规范」——规定了容器必须具备「获取 Bean、判断 Bean 是否存在、判断 Bean 作用域」等能力。
核心方法:public interface BeanFactory {
// 根据名称获取Bean(核心方法)
Object getBean(String name) throws BeansException;
// 根据名称+类型获取Bean
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
// 判断容器中是否包含该Bean
boolean containsBean(String name);
// 判断Bean是否是单例
boolean isSingleton(String name);
}
常见实现类:
DefaultListableBeanFactory:最基础的容器实现(ApplicationContext 底层依赖它);
ApplicationContext:继承 BeanFactory,是增强版容器(非懒加载、支持事件/国际化等)。
简单示例(使用 BeanFactory):
public class BeanFactoryDemo {
public static void main(String[] args) {
// 创建基础容器实例
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
// 注册一个简单的BeanDefinition(描述UserService)
BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(UserService.class).getBeanDefinition();
factory.registerBeanDefinition("userService", beanDefinition);
// 从容器获取Bean(BeanFactory的核心能力)
UserService userService = (UserService) factory.getBean("userService");
userService.sayHello();
}
}
class UserService {
public void sayHello() {
System.out.println("Hello BeanFactory");
}
}
2. FactoryBean:创建复杂 Bean 的「工厂接口」
FactoryBean 是 Spring 提供的自定义 Bean 创建逻辑的接口——当某个 Bean 的创建过程很复杂(比如需要多步初始化、依赖第三方资源),直接用 new 或注解无法满足时,就可以实现 FactoryBean 来定制创建逻辑。
