BeanFactory和FactoryBean的区别

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. 使用场景不同

对比项BeanFactoryFactoryBean
作用管理所有 Bean 的基础容器定制化创建复杂对象的工厂
是否接口是(顶级接口)是(一个特殊的 Bean 接口)
典型实现ApplicationContextXmlBeanFactorySqlSessionFactoryBean(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 的工具(超市里的自动售货机)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮乘白帝过重山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值