您现在的位置是:首页 > 正文

FactoryBean

2024-02-29 11:27:03阅读 0
这是一个由在{@link BeanFactory}中使用的对象所实现的接口,它们本身就是用于创建个别对象的工厂。当一个bean实现了这个接口时,它表明它不是一个直接暴露的常规bean实例,而是用于创建和暴露另一个对象的工厂。

实现了这个接口的bean不能被作为普通的bean使用。FactoryBean在定义时遵循了bean的形式,但是对于 bean 引用 (通过调用 ​getObject()​),始终暴露的是由 FactoryBean 创建的对象本身。

FactoryBean可以支持单例和原型两种作用域,同时可以按需延迟创建对象或在启动时立即创建。通过实现{@link SmartFactoryBean}接口,还可以提供更精细的行为元数据信息。

该接口在Spring框架内部被广泛使用,例如在AOP中的{@link org.springframework.aop.framework.ProxyFactoryBean}或{@link org.springframework.jndi.JndiObjectFactoryBean}中。它也可以用于自定义组件,但这通常更适用于基础架构代码。

在Spring框架的核心功能中,FactoryBean被用于以下目的:

  • 使用代理模式创建AOP代理对象:AOP代理的创建依赖于 ​ProxyFactoryBean​,通过实现FactoryBean来封装代理对象的创建逻辑。
  • 与JNDI整合:Spring使得与Java命名和目录接口(JNDI)进行集成的过程更加简化。​JndiObjectFactoryBean​作为一个FactoryBean被使用,它能够管理JNDI对象的查找和暴露。
  • 集成其他基础设施相关组件:比如与缓存、事务管理或消息队列等相关的组件,为了更好地集成和适配,可能会自定义FactoryBean。

FactoryBean是一个以编程方式定义的契约(contract)。实现类不应依赖于注解驱动的注入或其他反射机制。在引导过程中,对 ​getObjectType()​和 ​getObject()​方法的调用可能会比任何后处理器的设置更早进行。如果你需要访问其他的bean,请实现 ​BeanFactoryAware​接口并以编程方式获取它们。

容器只负责管理FactoryBean实例的生命周期,而不负责管理FactoryBean创建的对象的生命周期。因此,容器不会自动调用暴露的bean对象上的销毁方法(例如 ​java.io.Closeable#close()​)。相反,FactoryBean应该实现 ​DisposableBean​接口,并将任何关闭的调用委托给底层对象。

FactoryBean对象参与包含的BeanFactory的bean创建同步。通常除了FactoryBean本身(或类似情况)需要进行懒初始化之外,通常不需要进行内部同步。

public interface FactoryBean<T> {}

这是一个属性的名称,可以在 ​org.springframework.beans.factory.config.BeanDefinition​上通过 ​org.springframework.core.AttributeAccessor#setAttribute​方法设置。当无法从工厂Bean类中推断出对象类型时,工厂Bean可以使用该属性来表明其对象类型。

String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";

该方法返回由此工厂管理的对象的实例(可能是共享的或独立的)。与`BeanFactory`类似,这允许支持单例和原型的设计模式。如果在调用时该FactoryBean尚未完全初始化(例如因为它涉及循环引用),则抛出相应的`FactoryBeanNotInitializedException`异常。从Spring 2.0版本开始,FactoryBean被允许返回`null`对象。在这种情况下,容器将会将其视为正常值使用,不再抛出`FactoryBeanNotInitializedException`异常。现在鼓励FactoryBean实现根据需要自行抛出`FactoryBeanNotInitializedException`。

@Nullable
	T getObject() throws Exception;

返回此FactoryBean创建的对象的类型,如果提前无法确定,则返回null。这使得我们可以在不实例化对象的情况下检查特定类型的bean,例如在自动装配中。对于创建单例对象的实现,应尽量避免创建单例;而是预先估计对象的类型。对于原型对象,在这里返回一个有意义的类型也是可取的。此方法可以在此FactoryBean完全初始化之前调用。它不应依赖于初始化期间创建的状态;当然,如果存在这样的状态,仍然可以使用它。

注意: 自动装配会忽略返回null的FactoryBean。因此,强烈建议正确实现此方法,使用当前FactoryBean的状态。

@Nullable
	Class<?> getObjectType();

如果FactoryBean表明它持有一个单例对象,那么从 ​getObject()​方法返回的对象可能会被所属的BeanFactory缓存。因此,除非FactoryBean始终公开相同的引用,否则不应返回true。

FactoryBean本身的单例状态通常由所属的BeanFactory提供;通常,它必须在那里定义为单例。

注意:此方法返回false并不必然意味着返回的对象是独立的实例。扩展了SmartFactoryBean接口的实现可以通过其SmartFactoryBean#isPrototype()方法显式地指示独立实例。如果FactoryBean的isSingleton()方法返回false,并且它没有实现此扩展接口的话,则普通的FactoryBean实现被默认假设为总是返回独立的实例。

默认实现返回true,因为FactoryBean通常管理单例实例。

default boolean isSingleton() {
		return true;
	}

网站文章

  • spring boot + jpa/hibernate配置 failOnEmptyBeans和serializationInclusion

    以前我们在spring-mvc是这样配置的

    2024-02-29 11:26:55
  • elasticsearch获取分词结果

    原创于 【模棱博客】ES 中默认配置 IK 后,通过 Rest HTTP 的方式我们可以进行得到分词结果。那么在 Spring Boot 和提供的客户端依赖 spring-data-elasticse...

    2024-02-29 11:26:47
  • 135编辑器点击换图html,135编辑器如何换图片 135编辑器使用教程

    135编辑器点击换图html,135编辑器如何换图片 135编辑器使用教程

    135编辑器电脑版,是一款专业强大的微信公众平台在线编辑排版工具,很多小伙伴都在使用,初使用的小伙伴想知道135编辑器如何换图片,下面小编为大家带来135编辑器使用教程,感兴趣的小伙伴一起来看一看,希...

    2024-02-29 11:26:41
  • C# excel转换PDF 包括所有sheet

    C# excel转换PDF 包括所有sheet

    //测试:转换为pdf //在下面两个文件夹中找到 office 和 Microsoft.Office.Interop.Excel 两个dll //C:\Windows\assembly\GAC_MS...

    2024-02-29 11:26:12
  • 备忘录模式及其实现场景

    备忘录模式及其实现场景

    备忘录模式(Memento Design Pattern),也叫快照(Snapshot)模式。指在不违背封装原则前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态...

    2024-02-29 11:26:05
  • 蓝桥杯 Web 应用开发模拟赛首次公开!参赛选手速进!

    蓝桥杯 Web 应用开发模拟赛首次公开!参赛选手速进!

    第十三届蓝桥杯大赛报名通道正式开启,你行动起来了吗?很多细心的小伙伴一定看到了,这届蓝桥杯大赛中新增了 Web 应用开发组。这是 Web 应用开发首次出现在杯赛中,所以没有历年真题可以供参赛选手刷题。...

    2024-02-29 11:26:00
  • 算法基础模板——位运算、双指针算法、离散化、区间合并

    算法基础模板——位运算、双指针算法、离散化、区间合并 1. 位运算 求n的第k位数字:n&gt;&gt;k&amp;1; 返回n的最后一位1:lowbit(n) = n&amp;-n; 2. 双指针算法 for (int i = 0, j = 0; i &lt; n; i ++ ) { while (j &lt; i &amp;&amp; check(i, j)) j ++ ; // 具体...

    2024-02-29 11:25:31
  • 小白之CNN卷积神经网络详解 最新发布

    小白之CNN卷积神经网络详解 最新发布

    卷积是一个结果,并非过程。我们通常学习的是卷积操作的过程(卷积运算)。它是一种有效提取图片特征的方法。一般用一个正方形卷积核,遍历图片上的每一个像素点。

    2024-02-29 11:25:25
  • 日本武士甲

    http://wwgc.cc/luntan/viewthread.php?tid=99047&extra=&page=3

    2024-02-29 11:25:19
  • ZZY的爱好 比赛题 搜索

    ZZY的爱好 比赛题 搜索

    算法:1.只有16种爱好,枚举所有可能,每种爱好要或不要,总共有65536种状态。2.dfs直接枚举每种状态,并保持最优解,刚开始写搓了,dfs超时,原因是搜索没有控制好,搜索的状态变成16!View Code #include<stdio.h>#include<string.h>#include<stdlib.h>#includ...

    2024-02-29 11:24:50