Spring FactoryBean
FactoryBean简介
在此之前我们说过BeanFactory,请千万不要将FactoryBean与BeanFactory 搞混了,毕竟他们有着天壤之别;
接口将由BeanFactory中使用的对象实现,这些对象本身就是单个对象的工厂。如果一个bean实现了这个接口, 它将被用作一个要公开的对象的工厂,而不是直接作为一个将要公开的bean实例。
注意:实现此接口的bean不能用作普通bean。FactoryBean是在bean样式中定义的, 但是为bean引用公开的对象(getObject())始终是它创建的对象。
FactoryBean可以支持 singletons和 prototypes,,并且可以根据需要缓慢地创建对象,或者在启动时急切地创建对象。 SmartFactoryBean接口允许公开更细粒度的行为元数据。
该接口在框架本身中大量使用,例如用于AOP ProxyFactoryBean或JndiObjectFactoryBean。它也可以用于自定义组件; 但是,这只在基础结构代码中常见。
FactoryBean是一个程序化的契约。实现不应该依赖注释驱动的注入或其他反射工具。getObjectType()getObject() 调用可能在引导过程的早期到达,甚至在任何后处理器设置之前。如果需要访问其他bean,请实现BeanFactoryAware并以编程方式获取它们。
容器只负责管理FactoryBean实例的生命周期,而不负责由FactoryBean创建的对象的生命周期。 因此,对公开的bean对象(如关闭。关闭不会自动调用()。相反, FactoryBean应该实现DisposableBean并将任何这样的close调用委托给底层对象。
最后,FactoryBean对象参与包含BeanFactory的bean创建同步。通常不需要内部同步, 除了为了在FactoryBean本身(或类似的)中进行延迟初始化。
FactoryBean与BeanFactory区别
BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。 在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。 但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean, 它的实现与设计模式中的工厂模式和修饰器模式类似
FactoryBean源码
FactoryBean应用
这里我们用到了InitializingBean,您也可以不用的,直接 new 返回即可 详细的源代码FactoryBeanLearn.java
FactoryBean在Spring中的应该
这里需要您对SpringIoc源码有一些了解,若还不了解,请先阅读一下几篇文章,会对接下来的阅读有所帮助
接下的分析来自 refresh() -> finishBeanFactoryInitialization(beanFactory); - >preInstantiateSingletons()
在容器启动阶段,会先通过getBean()方法来创建FactoryBeanLearn的实例对象。如果实现了SmartFactoryBean接口, 且isEagerInit()方法返回的是true,那么在容器启动阶段,就会调用getObject()方法, 向容器中注册getObject()方法返回值的对象。否则,只有当第一次获取getObject()返回值的对象时,才会去回调getObject()方法。
在getBean()中会调用到doGetBean()方法,下面为doGetBean()精简后的源码。从源码中我们发现,最终都会调用getObjectForBeanInstance()方法。
getObjectForBeanInstance
getObjectFromFactoryBean
doGetObjectFromFactoryBean
Last updated
Was this helpful?