BeanFactory 和 FactoryBean 的区别
1. 角色不同
-
BeanFactory:是 IOC 容器的“大总管”,负责管理所有 Bean 的创建、依赖注入和生命周期。
// 例如:ApplicationContext 就是 BeanFactory 的增强版 BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml"); UserService userService = factory.getBean(UserService.class);
-
FactoryBean:是 特殊 Bean 的“工厂”,用来创建复杂的、不能直接 new 的对象(如 MyBatis 的
SqlSessionFactory
)。public class MyFactoryBean implements FactoryBean<User> { @Override public User getObject() { // 实际返回的对象 return new User("张三"); // 可以在这里做复杂初始化 } @Override public Class<?> getObjectType() { return User.class; } }
2. 获取对象的方式不同
-
BeanFactory:直接
getBean(Class)
获取目标对象。 -
FactoryBean:
-
如果直接
getBean("myFactoryBean")
,拿到的是FactoryBean
生产的对象(如User
)。 -
如果想拿到
FactoryBean
本身,需要加&
前缀:getBean("&myFactoryBean")
。
-
3. 使用场景不同
对比项 | BeanFactory | FactoryBean |
---|---|---|
作用 | 管理所有 Bean 的基础容器 | 定制化创建复杂对象的工厂 |
是否接口 | 是(顶级接口) | 是(一个特殊的 Bean 接口) |
典型实现 | ApplicationContext 、XmlBeanFactory | SqlSessionFactoryBean (MyBatis) |
举个栗子
需求:创建一个“随机用户”的 Bean,每次获取时生成不同用户。
用 FactoryBean 实现:
public class RandomUserFactoryBean implements FactoryBean<User> { @Override public User getObject() { return new User("用户" + System.currentTimeMillis()); // 每次新用户 } @Override public Class<?> getObjectType() { return User.class; } @Override public boolean isSingleton() { return false; // 非单例,每次getBean是新对象 } }
XML 配置:
<bean id="randomUser" class="com.example.RandomUserFactoryBean"/>
使用时:
User user1 = context.getBean("randomUser"); // 拿到的是User对象 User user2 = context.getBean("randomUser"); // 另一个新User FactoryBean factory = context.getBean("&randomUser"); // 拿到FactoryBean本身
一句话总结
-
BeanFactory 是 管理 Bean 的容器(超市老板)。
-
FactoryBean 是 生产特殊 Bean 的工具(超市里的自动售货机)。