使用 Spring 按需创建 Bean

2023-12-27

我想在启动后以工厂模式创建一些 spring beans。例如,我经常有一些工作要做,并且需要创建一个任务 bean(它可能依赖于其他单例 spring bean)并执行它。

可能有多个工作要同时执行,因此每个任务 bean 都需要是独立的(原型)。

人们是否使用任何通用模式来实现这一目标?

正如我所见,我需要以某种方式与容器/applicationContext 进行交互,但我真的不想将 applicationContext/beanFactory 的注入分散到各处,并调用 getBean("...") 。

我想到了这样的东西(注意“工厂”是我想象的东西,而不是存在的东西)

<bean id="myTask" class="MyTask" scope="prototype">
  <property name="entityManager" ref=".../>
  ...
</bean>

<bean id="myTaskExecutor" class="MyTaskExecutor">
  <property name="taskFactory">
     <xxx:factory bean="myTask"/>
  </property>
</bean>

然后编码

class MyTaskExecutor
{
  private Factory<MyTask> taskFactory;

  public void setTaskFactory( Factory<MyTask> taskFactory )
  {
    this.taskFactory = taskFactory;
  }
}

也许还有注释版本

class MyTaskExecutor
{
  @Factory(MyTask.class)
  private Factory<MyTask> taskFactory;

}

也许已经有类似上面的东西了?或者我在某个地方遗漏了一些基本的东西。

我意识到我可以有一个单例 MyTaskFactory 并使用它来实例化使用“new”,但随后我必须从工厂传递它的所有依赖项,这感觉不对。

所以我想总结一下问题是

从应用程序代码中按需创建原型 spring bean 的推荐方法是什么?

感谢任何输入。


我认为你把问题过于复杂化了。您需要做的就是写一个TaskFactory类(没有什么特别的,没有特殊的接口或注释)。TaskFactory将被注入所有其他所需的豆子,并且将有一个createTask方法按需创建任务,并在创建新任务时将对所需 Spring bean 的引用传递给新任务。客户端代码被注入TaskFactory,并调用createTask在需要的时候。

Spring 本身没有为您想要做的事情提供明确的支持。喜欢的factory-methodXML 属性和FactoryBean接口仅适用于在其范围内一次性创建 bean,如果您想按需创建它们,这意味着scope="prototype",这意味着使用getBean().

edit:可能值得指出的是,原型范围的 bean 实际上并不是 Spring 的设计目的。是的,它支持它们,但使用它们并不是一种非常有启发性的体验。如果你really想要走这条路,那么值得看看@Configurable http://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.html#aop-atconfigurable。它非常强大,但由于运行时类加载器的限制,并不总是合适。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Spring 按需创建 Bean 的相关文章

随机推荐

  • 如何使用 getElementsByName 访问复选框及其值

    假设我有一个表单的以下部分 td p p td
  • T(n-1) 的时间复杂度

    我对解决这个时间复杂度问题感到困惑 T n T n 1 我知道在快速排序最坏的情况下T n T n 1 T 1 n 其评估结果为 n 1 n 2 n 3 1 这个几何数列等于O n 2 然而 我在 stackoverflow 上看到答案说T
  • SharePoint 在线 OAuth2 令牌 invalid_scope

    我正在尝试为我注册的 Azure AD 应用程序获取不记名令牌 以通过 API 读取我的所有共享点网站 我按照微软的指南进行了操作 授予应用程序权限 https learn microsoft com bs latn ba azure ac
  • 使用谷歌翻译脚本翻译的页面中的 SvG 元素抛出错误

    我在页面中使用 SVG 元素 当将页面转换为德语时 我在控制台中遇到以下脚本错误 错误 未捕获类型错误 a b target className indexOf 不是 功能 有人有解决方案吗 这与在 Chrome 中安装 Google Tr
  • 隐藏 PHP / MySQL 错误消息

    我有一个基于X Cart http www x cart com 运行良好 但是 当我转到该地址 手动访问链接 时www mysite com Xx
  • 我们对 JS 中的箭头函数优化有任何保证吗?

    假设我们有下一个函数 const x a gt a const result x hello 我们在 Google V8 Firefox Quantum 中是否有任何保证 x将被优化为const result hello 我为什么要问它 请
  • 在 Postgres 中将表行的子集从一个数据库复制到另一个数据库的最佳方法是什么?

    我有一个生产数据库 比如说有一千万行 我想从过去一小时的生产中提取大约 10 000 行 并将它们复制到我的本地盒子中 我怎么做 假设查询是 SELECT FROM mytable WHERE date gt 2009 01 05 12 0
  • 在 R 数据框中按组应用计算

    我有这样的数据 object category country 495647 1 RUS 477462 2 GER 431567 3 USA 449136 1 RUS 367260 1 USA 495649 1 RUS 477461 2 G
  • Github - 有时无法通过 ssh 连接

    情况 我正在使用Linux 薄荷伴侣17 2 当通过 ssh 推送到 github 时 有时连接会失败 通常会在重新启动计算机和网络后恢复 几天后 可能又变坏了 很混乱 通过http推送从来没有这样的问题 但它需要密码 不太方便 调试信息
  • FHSTwitterEngine - 'NSInvalidArgumentException','数据参数为零'

    我正在使用 FHSTwitterEngine 将 gif 发布到 twitpic 当我的 iPhone 上有 wifi 或 3G 连接时 一切正常 但我还想在没有连接或上传失败时实现一些错误处理 因此 为了进行测试 我将 iPhone 置于
  • 连接两个表的表是否应该有自己的ID?

    我有两张桌子 First id name Second id name 另一张表连接前两个表 Third first id second id 第三张桌子在那里only解决M N问题 应该有自己的ID吗 如果表仅包含两个外键 则没有理由拥有
  • Mybatis 嵌套一对一或一对多关系映射

    我使用 myBatis 来映射一个简单的数据库 作为示例 它由4个型号组成 User Car Tariff 保险 User has 私人列表 carList and 私人关税关税以及其他一些带有 getter 和 setter 的字段 Ca
  • 如何识别特定时间范围内发生的行?

    我有一张表 其中包含患者的医院就诊情况 我正在尝试标记上次访问后 90 天内发生的访问 然而 需要注意的是 一旦一次访问被标记为重叠访问 该访问就不应用于评估与另一次访问的重叠 让我用一个例子来解释一下 Table visitID pati
  • 数据注释 - 使用属性扩展并将正则表达式存储在资源文件中

    我目前正在与MVC4数据注释来处理验证 我正在开发一个非常国际化的网站 因此我将所有文本保存在资源文件中 我还想在资源文件中保留用于验证的正则表达式 以便我可以使用相同的代码进行检查 例如 邮政编码 英国 and 邮政编码 美国 只需使用不
  • PropertyDescriptor和WPF绑定机制

    背景 我正在调查一些代码并遇到一个包含DataGrid有一些绑定列 Binding Binding calc from 我到处搜索 但没有包含名为的属性的类calc from 然后我偶然发现了一些PropertyDescriptor类 我认
  • 为什么 C# 7 ValueTuples 实现 Equals 方法而不是双等于运算符?

    考虑以下代码片段 var tuple1 7 foo var tuple2 7 foo var tuple3 42 bar Assert That tuple1 Equals tuple2 Is True This passes Assert
  • Java - Future.get() 多次调用

    Java 是如何实现的Future get 任务完成后多次调用的情况下表现如何 它返回相同的结果吗 或者抛出一个ExecutionException如果计算失败 一次又一次出现相同的异常 我在文档中找不到任何有关它的内容 您可以致电get
  • Android源代码不工作,通过glReadPixels读取帧缓冲区

    我是 Android 开发新手 有一项任务是在指定的时间间隔后读取帧缓冲区数据 我想出了以下代码 public class mainActivity extends Activity Bitmap mSavedBM private EGL1
  • 我应该使用哪种依赖注入工具? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Spring 按需创建 Bean

    我想在启动后以工厂模式创建一些 spring beans 例如 我经常有一些工作要做 并且需要创建一个任务 bean 它可能依赖于其他单例 spring bean 并执行它 可能有多个工作要同时执行 因此每个任务 bean 都需要是独立的