带着问题看源码 —— BeanFactory和FactoryBean

BeanFactory

说明: spring容器的底层接口,可以根据bean定义的信息,返回对应的实例对象,支持整个sring的生命周期流程。
提供的方法:
在这里插入图片描述

FactoryBean

说明: 就是一个简单的对象工程,实现了此接口的方法在整个bean周期中,可以使用自定义的方式来创建对象,而不需要进行默认的bean流程的创建。
提供的方法
在这里插入图片描述
使用

public class MyFactoryBean implements FactoryBean<Person> {
    
    @Override
    public Person getObject() throws Exception {
        Person person = new Person();
        person.setName("张三");
        person.setAddress("上海市上海");
        return person;
    }

    @Override
    public Class<?> getObjectType() {
        return Person.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

当我们使用时,如下就可以获取到对应的Person对象

public static void main(String[] args) {
        ApplicationContext bf = new ClassPathXmlApplicationContext("beanFactory.xml");
        // 直接就可过去到对应的Person对象
        Person person = (Person) bf.getBean("myFactoryBean");
}

这时细心的同学不知道有没有发现,那我需要怎么获取对应的myFactoryBean对象呢?
这是我们看源码在BeanFactory中定义了一个
在这里插入图片描述
也就是如果我们需要获取FactoryBean的实例而不是对应的getObject方法时,需要在getBean的前面加个&,也就是如下所示

ApplicationContext bf = new ClassPathXmlApplicationContext("beanFactory.xml");
       MyFactoryBean myFactoryBean = bf.getBean("&myFactoryBean", MyFactoryBean.class);

这个逻辑的判断就是
在这里插入图片描述
并且在BeanFactoryUtils.transformedBeanName(),方法中进行判断是否带了对应的&符号,如果带了就返回对应的工厂Bean实力,如果没有带则获取调用对应的getObject方法返回对应的具体bean实力(Person对象)
在这里插入图片描述

BeanFactory和FactoryBean的关系

我们从FactoryBean的源码注释中,就能看出一些说明,实现了FactoryBean的bean不单单是一个bean的实例,我们可以通过其中的getObject()方法,得到我们自定义的对象。
在这里插入图片描述
简单总结:FactoryBean只是BeanFactory在bean的周期中的一个条件分支的处理,可以让我们自定义实现对象的创建,而不需要完成整个复杂的Bean的创建过程。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值