概述:
- ObjectFactory是在单例解决循环依赖时先暴露的一个(单个)Bean的创建工厂,Bean创建成功后没有用处;
- BeanFactory是个工厂接口,作用根据配置信息创建SpringBean,获取bean等方法;
- FatoryBean是某一个Bean的工厂接口,作用是创建某一个bean。
ObjectFactory(循环依赖)![](https://img-blog.csdnimg.cn/direct/c5b14c118a38466bbd40d7e55dadb84f.png)
ObjectFactory仅仅关注一个或者一种类型Bean的查找,并且自身不具备依赖查找的能力。
用于延迟查找的场景,它就是一个普通工厂,当得到 ObjectFactory 对象时,相当于 Bean 没有被创建,只有当 getObject() 方法时,才会触发 Bean 实例化等生命周期。
主要用于暂时性地获取某个 Bean Holder 对象,如果过早的加载,可能会引起一些意外的情况,比如当 Bean A 依赖 Bean B 时,如果过早地初始化 A,那么 B 里面的状态可能是中间状态,这时候使用 A 容易导致一些错误。
BeanFactory
(与实现ApplicationContextAware、BeanNameAware接口~Bean的生命周期有关系。)
-
BeanFactory实现了ObjectFactory接口
-
BeanFactory则提供单一类型,集合类型和层次性的依赖查找能力.
在 Spring 中,BeanFactory是 IoC 容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
BeanFactory 提供的高级配置机制,使得管理任何性质的对象成为可能。
ApplicationContext 是 BeanFactory 的扩展,功能得到了进一步增强,比如更易与 Spring AOP 集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的 context 实现(如针对 web 应用的WebApplicationContext)。
FatoryBean
FactoryBean
从名字上能看出这是一个Bean。Bean就是Spring对对象的一种定义,一个Bean就是一个或者一些同类型的对象。
FactoryBean是一个接口。实现了 FactoryBean 接口的类有能力改变 bean,FactoryBean 希望你实现了它之后返回一些内容,Spring 会按照这些内容去注册 bean。getObject用来返回实例化后的对象。
getObjectType用来返回对象的类型。
isSingleton用来标识对象是否为单例的,这里默认为true,Spring会将实例化后的对象放入BeanFactory容器中。
通常情况下,bean 无须自己实现工厂模式,Spring 容器担任工厂 角色;但少数情况下,容器中的 bean 本身就是工厂,作用是产生其他 bean 实例。由工厂 bean 产生的其他 bean 实例,不再由 Spring 容器产生,因此与普通 bean 的配置不同,不再需要提供 class 元素。
凡是实现了FactoryBean接口的类,负责返回这个java类的实例化对象。
从设计模式的角度来看这就是典型的工厂方法模式。由一个特定的工厂来生产特定的java类的实例化对象。
Spring容器中有两种Bean,一种是普通的Bean对象,一种是实现了FactoryBean的工厂Bean对象。如果从BeanFactory中getBean的时候,获取到的Bean对象是工厂Bean,会自动的调用它的getObject方法返回真实实例化对象。
如果就是需要获取FactoryBean对象,需要在getBean的时候加上前缀’&’。
Spring自身就对FactoryBean有70多种实现,比较常见的就是Proxy,Jndi等场景。AOP中使用的ProxyFactoryBean。
Dubbo中使用的ReferenceBean。
Mybatis中使用的SqlSessionFactoryBean。
引用:
https://blog.csdn.net/u014470148/article/details/119853664