1,F(xiàn)actoryBean介紹
1)定義
如果一個(gè)bean實(shí)現(xiàn)了FactoryBean接口,它被作為工廠bean去暴露,而不是它本身。
If a bean implements this interface, it is used as a factory for an object to expose, not directly as a bean instance that will be exposed itself
image.png
2)FactoryBean會(huì)向容器中注冊(cè)兩個(gè)Bean:一個(gè)是它本身,一個(gè)是FactoryBean.getObject()方法返回值所代表的Bean。
3)對(duì)比BeanFactory:BeanFactory是bean容器,完成bean的創(chuàng)建、裝配等
FactoryBean是一個(gè)特殊的bean,用于創(chuàng)建bean的bean
4)FactoryBean作為spring的擴(kuò)展點(diǎn),bean的加載每次返回bean實(shí)例前,都會(huì)使用getObjectForBeanInstance來(lái)處理FactoryBean。
image.png
image.png
image.png
image.png
2,F(xiàn)actoryBean應(yīng)用 - dubbo消費(fèi)端proxy生成
1)dubbo:reference配置
image.png
2)使用從AbstractApplicationContext容器中g(shù)etBean,應(yīng)用spring FactoryBean加載機(jī)制,調(diào)用ReferenceBean實(shí)現(xiàn)了ReferenceBean接口
的getObject方法
image.png
image.png
3)創(chuàng)建proxy返回bean
image.png
3,F(xiàn)actoryBean應(yīng)用 - mybatis-spring插件
1)配置SqlSessionFactoryBean
image.png
2)SqlSessionFactoryBean繼承了FactoryBean,重寫了getObject方法
image.png
buildSqlSessionFactory()方法會(huì)根據(jù)mybatis的配置進(jìn)行初始化
image.png
3)MapperScan中MapperFactoryBean,使用FactoryBean
image.png
MapperScannerRegistrar 將定義的Mapper解析為BeanDefinition,設(shè)置beanClass屬性為MapperFactoryBean
image.png
image.png
4)MapperFactoryBean獲取mapper
每一個(gè)
image.png
image.png
調(diào)用JDK的動(dòng)態(tài)代理
image.png