Spring中 BeanFactory和FactoryBean分别是什么?

Spring 中 BeanFactory 是什么?

BeanFactory其实就是IoC的底层容器,它本身只是一个接口,顾名思义Bean工厂,定义了Spring的基本功能框架,主要功能就是

  • 负责从配置源中读取 Bean 的定义,并创建、管理这些 Bean 的生命周期

  • 然后是延迟初始化,它只会在 Bean 首次请求时才会实例化该 Bean,而不是在容器启动时就立即创建所有的Bean

Spring 中的 FactoryBean 是什么?

FactoryBean是 Spring 提供的一个特殊接口,允许开发者通过自定义的逻辑创建Bean 实例。它提供了更加灵活的初始化定制功能

FactoryBean 接口有几个主要的方法

  • getObject(): 返回此工厂创建的对象的实例。该返回值会被存储到IoC容器,解决循环依赖的第三级缓存就是工厂bean

  • isSingleton(): 判断此 FactoryBean 是否返回单例

  • getObjectType(): 返回 getObject() 方法返回的对象类型

假设你依赖一个第三方的类HappyMachine,而我们又不能修改第三方的类,并且这个对象创建比较复杂,那么你就可以创建一个 bean 来封装它:

// 实现FactoryBean接口时需要指定泛型
// 泛型类型就是当前工厂要生产的对象的类型
public class HappyFactoryBean implements FactoryBean<HappyMachine> {
    
    private String machineName;
    public String getMachineName() {          //get set
        return machineName;
    }
    public void setMachineName(String machineName) {
        this.machineName = machineName;
    }
    
    @Override
    public HappyMachine getObject() throws Exception {    //实例工厂bean,获取bean
    
        // 方法内部模拟创建、设置一个对象的复杂过程
        HappyMachine happyMachine = new HappyMachine();
        happyMachine.setMachineName(this.machineName);
        return happyMachine;   //返回对象
    }
    
    @Override
    public Class<?> getObjectType() {
        // 返回要生产的对象的类型
        return HappyMachine.class;
    }
}

这样,我们getBean("A”)会得到 A FactoryBean#getObject 的结果,如果单纯只想要 A的FactoryBean那么加个“&”即可,即 getBean("&A")

ApplicationContext ioc = new ClassPathXmlApplicationContext("....");    
HappyMachine happyMachine = ioc.getBean("happyMachine");         //返回的是getObject方法返回的对象                  
// &happyMachine7 这是一种固定的约束       
Object bean = iocContainer.getBean("&happyMachine");    //如果想要获取FactoryBean对象, 直接在id前添加&符号即可! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

空说

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

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

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

打赏作者

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

抵扣说明:

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

余额充值