BeanFactory和FactoryBean的区别-BeanFactory、FactoryBean和ObjectFactory-《Java笔记》

admin 2025-10-19 04:27:23 编程 来源:ZONE.CI 全球网 0 阅读模式

Java Spring BeanFactory FactoryBean ObjectFactory

结论

BeanFactory就是对象工厂,用于实例化和保存对象。FactoryBean是一个工厂对象,用于实例化创建过程比较复杂的对象。ObjectFactory是某个特定的工厂,用于在项目启动时,延迟实例化对象,解决循环依赖问题。

BeanFactory

Spring最最核心的接口,Bean工厂,从名字上就能看出这是一个工厂。那么既然是工厂就是用来生产对象的。

FactoryBean

从名字上能看出这是一个Bean。Bean就是Spring对对象的一种定义,一个Bean就是一个或者一些同类型的对象。FactoryBean是一个接口。

  1. public interface FactoryBean<T> {
  2. //返回的对象实例
  3. T getObject() throws Exception;
  4. //Bean的类型
  5. Class<?> getObjectType();
  6. //true是单例,false是非单例 在Spring5.0中此方法利用了JDK1.8的新特性变成了default方法,返回true
  7. boolean isSingleton();
  8. }

可以观察到FactoryBean接口有三个方法。getObject用来返回实例化后的对象。getObjectType用来返回对象的类型。isSingleton用来标识对象是否为单例的,这里默认为true,Spring会将实例化后的对象放入BeanFactory容器中。从方法上,能推测出,这个凡是实现了FactoryBean接口的类,负责返回这个java类的实例化对象。从设计模式的角度来看这就是典型的工厂方法模式。由一个特定的工厂来生产特定的java类的实例化对象。那么这种写法有哪些好处呢?正常情况下,Spring中在实例化对象的时候,都是由BeanFactory从上下文中获取BeanDefinition信息,然后通过反射,调用这个java类的构造方法进行实例化。而现在这种形式,相当于将实例化的功能交给了FactoryBean去实现。这种方式主要使用在一些比较复杂的实例化过程中,并非简单地设置一些参数或者设置的参数过多,过程中可能需要做一些复杂的解析、判断和逻辑处理,这个时候交由Spring去通过反射进行实例化可能就不太灵活了,Spring容器中有两种Bean,一种是普通的Bean对象,一种是实现了FactoryBean的工厂Bean对象。如果从BeanFactorygetBean的时候,获取到的Bean对象是工厂Bean,会自动的调用它的getObject方法返回真实实例化对象。如果就是需要获取FactoryBean对象,需要在getBean的时候加上前缀’&’。Spring自身就对FactoryBean有70多种实现,比较常见的就是Proxy,Jndi等场景。AOP中使用的ProxyFactoryBean。Dubbo中使用的ReferenceBean。Mybatis中使用的SqlSessionFactoryBean

ObjectFactory

  1. public interface ObjectFactory<T> {
  2. //返回的对象实例
  3. T getObject() throws BeansException;
  4. }

这用于延迟查找的场景,它就是一个普通工厂,当得到 ObjectFactory 对象时,相当于 Bean 没有被创建,只有当 getObject() 方法时,才会触发 Bean 实例化等生命周期。主要用于暂时性地获取某个 Bean Holder 对象,如果过早的加载,可能会引起一些意外的情况,比如当 Bean A 依赖 Bean B 时,如果过早地初始化 A,那么 B 里面的状态可能是中间状态,这时候使用 A 容易导致一些错误

以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  11