Spring 源码分析 (六)FactoryBean 接口解析
作者:石臻臻,CSDN 博客之星 Top5、Kafka Contributor、nacos Contributor、华为云 MVP,腾讯云 TVP,滴滴 Kafka 技术专家、 KnowStreaming, 《Kafka 运维与实战宝典》电子书作者。领取《Kafka 运维与实战宝典》PDF 请联系石臻臻
KnowStreaming 是滴滴开源的Kafka运维管控平台, 有兴趣一起参与参与开发的同学,但是怕自己能力不够的同学,可以联系我,当你导师带你参与开源! 。
说道 FactoryBean,不少人会拿它跟 BeanFactory 作比较,但是实际上他们没有多大关系;我们简单介绍一下两者
一、BeanFactory 和 FactoryBean 区别
1BeanFactory
BeanFactory:这就是一个 Factory,是一个 IOC 容器或者叫对象工厂,它里面存着很多的 bean。例如默认的实现方式 DefaultListableBeanFactory;我们把 IOC 容器可以比作一个水桶,IOC 容器里面的所有 bean 就是装的水;##FactoryBean
FactoryBean:是一个 Java Bean,但是它是一个能生产对象的工厂 Bean,把 IOC 容器比作水桶,那么 Java Bean 就是水桶里面的水,但是这个 FactoryBean 一种比较特殊的水,可以把它看成是一个水球,这个水球里面也包含了水,我们可以通过 IOC 取这个水球,但是也可以直接取水球里面的水;(用法就是 用 &表示取水球,取水球里的水用正常的获取方式就行了;如果我们用 &获取到了水球之后,可以通过这个水球的 getObject 方法获取水球里面的水;)
在之前的文章中我们已经分析过 BeanFactory 的源码了,今天我们单独分析 FactoryBean
2 代码入口
3AbstractBeanFactory
AbstractBeanFactory extends FactoryBeanRegistrySupport
断点进去最后访问到 AbstractBeanFactory 的 getObjectForBeanInstance 方法;方法中的几个参数分别表示 beanInstance:通过 Object sharedInstance = getSingleton(beanName);获取到的,这个就是实例化的对象,就算用我们 getBean 的时候 beanName 传的是 fb,不是 &fb,这里返回的就是 FactoryBean 的实例对象;就是上面比喻的水球; name:就是传进来的 name ;没有过滤 &字符的; beanName:过滤了 &字符的
4FactoryBeanRegistrySupport
二、总结
总结一下整个 FactoryBean 源码的流程 1.判断是否需要调用 FactoryBean 的 getObject 方法来获取实例判断依据是:①.如果 name 有前缀 &,直接返回②.如果没有前缀 &,调用 getObject 方法获取实例 2.如果是通过调用 GetObject 方法获取实例,则还要执行一下后置处理器执行后置处理器接口的方法 BeanPostProcessor 中的 postProcessAfterInitialization(result, beanName);方法;
三、分析过程有一些需要单独分析,占个坑
1. mbd.isSynthetic()中的值是什么时候设置的?有什么用?
TODO...
2.BeanPostProcessor 后置处理器讲解
3.上面 Object alreadyThere = this.factoryBeanObjectCache.get(beanName);这段代码的意思?什么情况下要先查这个?
TODO.....
在这里插入图片描述
版权声明: 本文为 InfoQ 作者【石臻臻的杂货铺】的原创文章。
原文链接:【http://xie.infoq.cn/article/7116607c3f1d8fb3cfa3a6315】。未经作者许可,禁止转载。
评论