16 BeanFactory和FactoryBean有什么区别

vvEcho 2024-01-24 18:25:29
Categories: Tags:

区别

BeanFactory:beanFactory是所有Spring Bean的容器根接口,是IOC容器,并且提供方法支持外部程序对这些 bean 的访问,在程序启动时 根据传入的参数产生各种类型的bean,并添加到 IOC容器(实现 BeanFactory 接口的类) 的 singletonObject 属性中。

FactoryBean: 首先是个 bean,也存放在 BeanFactory 中。它具有工厂方法的功能,在程序运行中 产生指定(一种)类型的bean,并添加到了IOC容器中的 factoryBeanObjectCache 属性中。

BeanFactory是Spring提供的存放Bean的工厂,FactoryBean是一个可生产Bean的工厂Bean

FactoryBean和BeanFactory都是spring的一个类工厂,BeanFactory只能生产一种类型的类,FactoryBean可以生产两种类型的类,一种跟BeanFactory类似,生产的是当前对象,另一种是通过getObject()返回的对象

BeanFactory的使用场景:

FactoryBean的使用场景:

Spring 中 FactoryBean 最大的应用场景是用在 AOP 中。我们都知道,AOP 实际上是 Spring 在运行是创建出来的代理对象,这个对象是在运行时才被创建的,而不是在启动时定义的,这与工厂方法模式是一致的。更生动地说,AOP 代理对象通过 java 反射机制在运行时创建代理对象,并根据业务需求将相应的方法编织到代理对象的目标方法中。Spring 中的 ProxyFactoryBean 就是干这事的。

因此,FactoryBean 提供了更灵活的实例化 bean 的方法。通过 FactoryBean 我们可以创建更复杂的 bean

扩展:普通bean和factoryBean有啥区别?

-场景 - 普通 Bean - FactoryBean-
创建逻辑复杂度 简单(无状态依赖) 复杂(需多步骤初始化或外部资源,如数据库连接池的创建,需读取配置、初始化资源)
对象类型控制 直接暴露 Bean 实例 通过 getObject() 返回定制对象
生命周期管理 完整生命周期回调 工厂 Bean 走完整流程,产品对象仅初始化后
多例支持 需显式配置 @Scope(“prototype”) 通过 isSingleton() 动态控制