使用spring按需创建bean

Mik*_*e Q 5 java spring

我想在工厂模式启动后创建一些spring bean.例如,每隔一段时间我就有一些工作要做,我需要创建一个任务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>
Run Code Online (Sandbox Code Playgroud)

然后是代码

class MyTaskExecutor
{
  private Factory<MyTask> taskFactory;

  public void setTaskFactory( Factory<MyTask> taskFactory )
  {
    this.taskFactory = taskFactory;
  }
}
Run Code Online (Sandbox Code Playgroud)

也许是一个注释版本

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

}
Run Code Online (Sandbox Code Playgroud)

也许有类似上面的东西?或者我错过了一些基本的东西.

我意识到我可以有一个单独的MyTaskFactory并使用它来实例化使用"new"然后我必须从工厂传递所有它的家属感觉不对.

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

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

感谢任何输入.

ska*_*man 5

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

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

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