gpt4 book ai didi

java - 使用spring按需创建bean

转载 作者:搜寻专家 更新时间:2023-10-31 20:16:20 35 4
gpt4 key购买 nike

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

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

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

在我看来,我需要以某种方式与容器/applicationContext 进行交互,但我真的不想到处分散 applicationContext/beanFactory 的注入(inject)和对 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”进行实例化,但是我必须从工厂传递它的所有依赖项,这感觉不对。

所以我想总结一下这个问题是

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

感谢任何输入。

最佳答案

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

Spring 本身不对您尝试做的事情提供明确的支持。 factory-method XML 属性和FactoryBean 接口(interface)仅对在其范围内一次性创建 bean 有用,如果您想按需创建它们,这意味着 scope="prototype",这意味着使用 getBean()

编辑: 可能值得指出的是,原型(prototype)范围的 bean 实际上并不是 Spring 的设计目标。是的,它支持它们,但使用它们并不是一种很有启发性的体验。如果你真的想走这条路,那么它值得taking a look at @Configurable .它非常强大,但由于运行时类加载器的限制,并不总是适用。

关于java - 使用spring按需创建bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2128329/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com