Spring高级特性之四:FactoryBean和BeanFactory
FactoryBean和BeanFactory两只是两个单词顺序不同但是内容大不相同。落脚点在后面一个单词,前面一个单词是其功能描述:FactoryBean——工厂bean,一个建工厂的bean?BeanFactory——bean工厂,一个生产bean的工厂。初识比较拗口像最开始接触函数指针与指针函数一样。
Sring对外提供接口XXXApplicationContext的继承UML图,可以看到BeanFactory是容器的顶级接口,具体使用是其某个子类。本文不详述BeanFactory,在前面文章中有介绍其子类使用Spring Bean加载全过程(注解配置) - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)。
下面重点介绍FactoryBean:Spring中Bean有两种,⼀种是普通Bean,⼀种是⼯⼚Bean(FactoryBean), FactoryBean可以⽣成某⼀个类型的Bean实例),也就是说我们可以借助于它⾃定义Bean的创建过程。FactoryBean使⽤较多,尤其在Spring框架⼀些组件中会使⽤,还有其他框架和Spring框架整合时使⽤。
那么getBean时Spring如何判断要获取的这个bean对象使用用户自定义的FactoryBean构造呢?
通过跟踪源码可以找到处理逻辑:判断beandefinition是否FactoryBean,如果是则从工厂bean中获取对象。
其中从工厂bean获取对象时,判断是否有引用,可以获得构造对象的工厂bean对象:
测试案例如下:
bean:
factorybean:
配置类:
测试类:
对于&的有误,差别还是比较大的,如上源码分析——有&表示获取工厂bean,无表示通过工厂bean获取被构造的对象bean:
实际应用中,FactoryBean就可以定制化bean(如果使用配置方式比较复杂,定制化更实用时)。