前言

Spring中有BeanFactory接口,也有FactoryBean接口。注意不要混淆两者。

FactoryBean讲解

首先,先看其类的结构图:

spring中的工厂 spring的factorybean_初始化

1.FactoryBean也是一个由Spring容器管理的类。所以其可以通过BeanFactory的getBean方法获得。所以,FactoryBean与BeanFactory的关系就是管理与被管理的关系。
2.FactoryBean字面意思是工厂Bean。它就是起到一个工厂的作用。其getObject()方法可以生产另外一个对象,且生产的对象,也交由Spring容器管理。
3.FactoryBean不支持依赖注入,因为FactoryBean的调用时机在Spring初始化的早期进行,这时候还没有生成要依赖的对象。
4.Spring容器只负责管理FactoryBean实例的生命周期,而不管FactoryBean的getObject方法的生命周期,所以,不会自动调用getObject对象的close方法。如果有这种需求,那么getObject方法返回的类需要实现DisposableBean接口。
5.通过FactoryBean的实现类,首字母小写,获得的是getObject返回的对象。在首字母小写前面加一个&符号,获得的是FactoryBean实例本身。
6.isSingleton方法如果返回true,那么getObject方法每次返回的都是同一个对象,如果返回false,那么getObject方法每次返回不同的对象。
7.这种方式定义的对象和其他方式定义对象交由Spring管理,有何区别呢?
这种方法,相当于是动态的定义Spring管理的Bean。我们用@Component注解往Spring容器加入对象时,这个对象是固定不变的,而用FactroyBean的getObject定义对象时,可以自定义。

8.如果调用时该FactoryBean尚未完全初始化(例如,因为它涉及循环引用),则抛出相应的FactoryBeanNotInitializedException。(甜点:遇到某个异常时,可以从这个异常类的源码注释,找报错原因)

ListFactoryBean、MapFactoryBean、SetFactoryBean

Spring提供的这几个FactoryBean的实现类。用于在Spring的Bean中配置相应集合属性。在xml中进行配置。本质就是给Bean中的集合属性赋值。具体的使用方法可以参考用法 现在很少使用xml配置了,可以作为了解,在特殊的业务场景下,应用此技术。