使用 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 的相关文章

  • Spring Cloud Gateway - 记录传入请求 url 和相应的路由 URI

    我是 Spring Cloud Gateway 的新手 我想要的是将传入请求记录到相应的路由 url 例如如果我有以下路由配置 id route1 uri http localhost 8585 predicates Path foo fi
  • 配置 Eclipse 将 App Engine 类预先捆绑到单个 JAR 中以加快预热速度

    在与另一家同样使用 App Engine 的公司的同事进行讨论后 他告诉我 他通过以下步骤成功地将应用程序预热时间从约 15 秒缩短到约 5 秒 配置 Eclipse 将编译过程中生成的类捆绑到单个 JAR 文件中 配置 Eclipse 以
  • spring中如何一起发送@Requestbody和@Requestpart

    我想使用curl 在控制器中一起传递json 和文件 我在控制器中有以下方法 PostMapping value api campaign headers content type multipart mixed content type
  • 将 java 方法参数设置为最终参数

    那有什么区别final在下面的代码之间进行 将参数声明为有什么好处final public String changeTimezone Timestamp stamp Timezone fTz Timezone toTz return pu
  • 内部/匿名类的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 匿名类和静态内部类的最佳实践 设计和性能方面 是什么 就我个人而言 我认为静态内部类提供了更好的封装 并且应该提供更好的性能 因为它们无法访问类
  • bean 的 CDI @TransactionAttribute

    我正在尝试CDI在测试应用程序上 我有一个DAO它注入一个托管的容器JTA像这样的持久化上下文 public class TestDAO implements Serializable PersistenceContext private
  • Byte[] 和 java.lang.OutOfMemoryError 按位读/写文件

    我正在努力擦除 Android 中的一些可用空间 这是我的代码 private void creatingFileDelete int size int passMode File lastFile new File Environment
  • 相对重力

    我最近开始使用jMonkey引擎 这非常好 但我在尝试实现相对重力时陷入了困境 我想让行星彼此围绕轨道运行 不一定是完美的圆形轨道 取决于速度 所以每个对象都应该影响其他对象 我现在拥有的 关闭全球重力 bulletAppState get
  • java多线程中“私有最终对象”锁定有什么用?

    java多线程中 私有最终对象 锁定有什么用 据我的理解 我认为要使一个类成为线程安全的 我们应该使用内部锁定 将所有方法标记为同步并使用 this 将它们锁定在对象的监视器上 或者我们可以用方法中的私有最终对象锁替换类的 this 上标记
  • String.intern() 线程安全吗

    我想在Java中使用 String intern 来节省内存 对具有相同内容的字符串使用内部池 我从不同的线程调用这个方法 这是个问题吗 对你的问题的简短回答是肯定的 它是线程安全的 但是 您可能需要重新考虑使用此工具来减少内存消耗 原因是
  • 将序列化数据发送到 servlet 时出现 java.io.EOFException

    我正在尝试从 Java 本地应用程序上传一个包含文件到服务器的对象 我的计划是 在 tomcat 上运行的 servlet 将使用以下方法获取对象ObjectInputStream in the doGet方法 但我得到一个EOFExcep
  • mysql 准备好的语句错误:MySQLSyntaxErrorException

    我使用准备好的语句编写了选择语句 每次尝试运行都会出现此错误 我如何克服这个错误 我的jdbc连接器是mysql connector java 5 1 13 bin jar 我的代码 public Main add ad to getAdD
  • 如何在列表视图中选择时启用视频序列自动播放?

    大家好 有人可以与我分享一下我如何编写我的 viewvideo java 类 以便它允许自动播放视频功能 自动排序在列表视图中播放所选视频的任务 从当前位置到最新录制的视频 按顺序直到最新的视频播放完毕 这类似于 YouTube 自动播放功
  • 如何让 Camel FTP 按需只获取一次

    我对骆驼还很陌生 我一直在尝试让 Camel 根据需要仅通过 FTP 获取单个文件一次 我无法让它发挥作用 这是我尝试过的 让我知道什么是最好的方法以及我的代码有什么问题 1 读取文件后发送一条空消息当收到空消息时 停止路由 from di
  • 使用 SimpleDateFormat、Java 进行错误的日期解析

    我需要使用日期模式 yyyy MM dd 解析输入字符串中的日期 如果日期采用任何其他格式 则抛出错误 这是我解析日期的代码 private void validateDate throws MyException Date parsedD
  • 原子整数的compareandexchange()与compareandset()

    在研究 AtomicInteger 时 我发现这个 API 提供了两种方法 比较和交换 如果当前值被引用 则自动将该值设置为 newValue to 作为见证值 预期值 记忆效应为 由指定VarHandle compareAndExchan
  • 使用替换但不使用根元素的 Jaxb 继承

    我正在浏览布莱斯的博客http blog bdoughan com 2010 11 jaxb and inheritance using substitution html http blog bdoughan com 2010 11 ja
  • CreateProcess error=206,运行 gwtCompile 时文件名或扩展名太长

    我的应用程序是一个 springboot gradle 应用程序 我的应用程序的一部分涉及使用 gradle 进行遗留 gwt 编译 它工作正常 但今天当我运行下面的 gradle 任务时 它显示 CreateProcess error 2
  • 如何使用 iBatis (myBatis) 的注释进行 IN 查询?

    我们只想在 MyBatis 中使用注释 我们确实在努力避免使用 xml 我们尝试使用 IN 子句 Select SELECT FROM blog WHERE id IN ids List
  • Spring Boot 2 中的 401 代替 403

    With 春季启动 https projects spring io spring boot 1 5 6 发布我能够发送 HTTP 状态代码401代替403如中所述如果请求未经身份验证的uri 如何让Spring Security响应未经授

随机推荐

  • 如何使用 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 都需要是独立的