使用spring按需创建bean

时间:2010-01-24 19:11:33

标签: java spring

我想在工厂模式启动后创建一些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的推荐方法是什么?

感谢任何输入。

2 个答案:

答案 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使用默认的单例范围。所以我现在有非线程安全的代码,但是想要改进它以便在轨道上进一步保持线程安全。