Srping Factory Bean解析

93 阅读2分钟

processon

www.processon.com/view/61af06…

什么是FactoryBean

FactoryBean 其实就是一种特殊的bean对象。

Snipaste_2022-03-28_22-07-12.png 特殊在哪?

1.任何FactoryBean对象都需要实现FactoryBean接口,重写getObject和getClass方法。可以看作是FactoryBean对象封装了其他对象的生成过程。

2当一个对象放入spring容器,从容器中获取的就是bean对象,但是如果是一个Factorybean对象放入容器,那么获取的将是Factorybean对象封装的对象及getObject返回的对象。若想获得自身FactoryBean对象 则需要在beanName前加上前缀“&”。

Spring是如何做到

其实很简单也就是进行容器的分割。

Spring的一级缓存其实就是Spring的主容器,所有的bean对象都来自这个map。

但其实factoryBean对象封装的对象并不是存在这个一级缓存的。它存在于另一个缓存map,即FactoryBeanRegistrySupport类的factoryBeanObjectCache缓存

源码解析

定位到AbstractBeanFactory类getObjectForBeanInstance方法。(从doGetBean方法进入)

Snipaste_2022-03-28_22-59-17.png

Snipaste_2022-03-28_23-02-34.png

Snipaste_2022-03-28_22-54-55.png

Snipaste_2022-03-28_22-48-17.png

Snipaste_2022-03-28_22-51-58.png

至此,factoryBean在Spring容器中是如何获取生成的,存放在哪里的,Spring源码中是如何处理factoryBean对象的应该是比较清楚的了。

后续思考

factoryBean一般在哪里使用又是如何使用的?

其实上面也说了factoryBean对象就是封装了其他对象的生成过程。一般用在对于接口的注入。比如我们非常熟悉的dao层接口注入,feign接口的注入等等。 dao层接口对应的就是mapperFactoryBean对象,feign接口对应的就是feignClientFactoryBean对象。 这些factoryBean对象就是封装了这些接口对象的实例化的过程,具体实例话的时候干了什么,可以自行阅读源码,此处不多做解析。

这都是我自己阅读Spring源码所做的分析,如有错误请大佬指正,谢谢!