Spring中的FactoryBean是啥?

我们在getBean的时候,进入的类是AbstractBeanFactory类

但是Spring中还有一个FactoryBean,这个是干嘛用的呢?

其实FactoryBean也是一个接口,是为了我们可以自定义对某个对象的处理

比如我们有一个Student,我们想在Student对象对某些属性赋值,可以让student实现一个FactoryBean接口,在getObject的时候进行相关改造;
也可以创建一个FactoryBean的实现类,用于指定生成某些类的代理对象,比如Spring整合Mybatis,为什么我们可以直接Autowire一个mapper接口并没有写一个实现类;
https://www.bilibili.com/video/BV16v41147ww?p=11 这个视频入门了FactoryBean
其原理就是 先MapperScan遍历mapper,分别生成BeanDefinition,然后创建多个MapperFactoryBean,在getObject中生成不同mapper的代理对象

源码:

在这里插入图片描述

示例代码:

在这里插入图片描述

在这里插入图片描述
控制台输出:
强啊霸哥
1611510111320
强啊霸哥
1611510111320

两次invokeTime是一样的,说明,这个getObject方法并没有被调用过两次
这个后续跟代码看一下

----------2021-8-16 00:32:00更新
为什么两次输出的invokeTime是一样的呢? 并不是getObject没有被调用两次,而是在第一次调用后,将getObject方法生成的对象加入到了缓存中,这样就不用再次执行一遍,节省资源、

AbstractBeanFactory
在这里插入图片描述

FactoryBeanRegistrySupport:
在这里插入图片描述

注意

bean在初始化的时候,并没有调用factoryBean中的getObject方法,而是在初始化之后已经存在于单例池中的时候,才会调用getObject方法;

初始化流程:
在这里插入图片描述
在这里插入图片描述
可以看到 直接return 了原来的bean

第二次getBean
在这里插入图片描述
在这里插入图片描述

区别在于 进入AbstractBeanFactory#getObjectForBeanInstance方法时传的入参name,
bean第一次初始化的时候,spring会处理此name加前缀 &
而第二次get的时候,没有特殊处理,传的普通的beanName,所以同一个方法走了两个分支;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值