一.概念
BeanFactory,以Factory结尾,表示它是一个工厂类(接口), 负责生产和管理bean
FactoryBean,以Bean结尾,表示它是一个bean(接口),被BeanFactory管理着
那什么是bean?能被Spring容器实例化、组装、管理的对象都是bean,如

二.FactoryBean使用例子
1.假如现在有这样一个支付场景,只有一个支付通道,银行,代码很容易想到

2.现在多了一个支付通道:支付宝,接口不用修改,多了一个实现类,很明显@Autowired private Pay pay;根据类型注入要换成@Resource

3.又多了一个支付通道:微信支付,增加支付通道,和业务类BussinessService并没有关系,如果不停的在业务类里面增加判断显然是不对的!那怎么办呢?我们现在是不是特别希望有一个对象可以自动为我们找到对应的支付通道,于是

上面多了一个PayFactory类,专门负责取到对应支付通道的,这个就是我们要找的类,完美实现需求
4.但是,如果支付渠道未来可能再增加(甚至多到没有一个具体的数量),每个支付渠道的使用场景依赖于支付金额多少,如100块以下用微信,100-500用支付宝,500-1000用中国银行.......这些支付规则属于支付的事情,不能耦合在业务代码中,此时就要用到FactoryBean的功能了

其中,实现ApplicationContextAware接口是为了设置applicationContext,实现InitializingBean接口是为了设置payObject;

FactoryBean+动态代理功能,实现了支付通道和业务代码的完全解耦,增加支付通道,只要增加对应的实现类即可,对业务类来说完全无感知
5.其实一般情况下,我们很少能用到FactoryBean的功能,FactoryBean是spring容器预留的一个扩展点,不方便直接在容器中取的bean可以通过FactoryBean包装一下再取出来

6.为了方便区别,从容器中取FactoryBean自己bean的时候,要加上“&”,否则容器默认调用getObject方法取bean
7.spring在整合mybatis的过程中,FactoryBean+动态代理=MapperFactoryBean类中通过接口class生成dao对象