我想在工厂模式启动后创建一些spring bean。例如,每隔一段时间我就有一些工作要做,我需要创建一个任务bean(它可能依赖于其他单例弹簧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的推荐方法是什么?
感谢任何输入。
答案 0 :(得分:4)
我认为你的问题太复杂了。您需要做的就是编写一个TaskFactory
类(没什么特别的,没有特殊的接口或注释)。 TaskFactory
将注入所需的所有其他bean,并且将具有createTask
方法,该方法按需创建任务,并在创建时将对所需Spring bean的引用传递给新任务。客户端代码注入TaskFactory
,并在需要时调用createTask
。
Spring本身并没有为你要做的事情提供明确的支持。类似factory-method
XML属性和FactoryBean
接口只适用于在其范围内一次性创建bean,如果您想按需创建它们,则意味着scope="prototype"
,这意味着使用getBean()
。
编辑:值得指出的是,原型范围的bean实际上不是Spring的设计目标。是的,它支持它们,但使用它们并不是一种非常有启发性的体验。如果真的想要走这条路,那么它值得taking a look at @Configurable
。由于运行时类加载器约束,它非常强大,但并不总是合适。
答案 1 :(得分:0)
我正在尝试做一个非常类似的事情(Spring 3.0),所以我有兴趣听听你是如何解决这个问题的。
我目前的方法是使用getBean(),我已经使用我的Spring-instatiated beans / pojos使用默认的单例范围。所以我现在有非线程安全的代码,但是想要改进它以便在轨道上进一步保持线程安全。