Spring高级特性之四:FactoryBean和BeanFactory

  FactoryBean和BeanFactory两只是两个单词顺序不同但是内容大不相同。落脚点在后面一个单词,前面一个单词是其功能描述:FactoryBean——工厂bean,一个建工厂的bean?BeanFactory——bean工厂,一个生产bean的工厂。初识比较拗口像最开始接触函数指针与指针函数一样。

  Sring对外提供接口XXXApplicationContext的继承UML图,可以看到BeanFactory是容器的顶级接口,具体使用是其某个子类。本文不详述BeanFactory,在前面文章中有介绍其子类使用Spring Bean加载全过程(注解配置) - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)

        

                  

  下面重点介绍FactoryBean:SpringBean有两种,⼀种是普通Bean,⼀种是⼯⼚BeanFactoryBean), FactoryBean可以⽣成某⼀个类型的Bean实例),也就是说我们可以借助于它⾃定义Bean的创建过程。FactoryBean使⽤较多,尤其在Spring框架⼀些组件中会使⽤,还有其他框架和Spring框架整合时使⽤。

                  

   那么getBean时Spring如何判断要获取的这个bean对象使用用户自定义的FactoryBean构造呢?

  通过跟踪源码可以找到处理逻辑:判断beandefinition是否FactoryBean,如果是则从工厂bean中获取对象。

   其中从工厂bean获取对象时,判断是否有引用,可以获得构造对象的工厂bean对象:

                

   测试案例如下:

    bean:

               

     factorybean:

              

     配置类:

              

     测试类:

              

     对于&的有误,差别还是比较大的,如上源码分析——有&表示获取工厂bean,无表示通过工厂bean获取被构造的对象bean:

              

     实际应用中,FactoryBean就可以定制化bean(如果使用配置方式比较复杂,定制化更实用时)。

 

posted on 2021-11-12 15:35  池塘里洗澡的鸭子  阅读(86)  评论(0编辑  收藏  举报