我们在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,所以同一个方法走了两个分支;