Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用spring按需创建bean_Java_Spring - Fatal编程技术网

Java 使用spring按需创建bean

Java 使用spring按需创建bean,java,spring,Java,Spring,我想在启动后以工厂模式创建一些Springbean。例如,我经常有一些工作要做,我需要创建一个任务bean(它可能依赖于其他单例springbean)并执行它 可能有多个工作要并发执行,因此每个任务bean都需要是独立的(原型) 人们有没有共同的模式来实现这一点 在我看来,我需要以某种方式与容器/applicationContext进行交互,但我并不想将applicationContext/beanFactory的注入和对getBean(“…”)的调用分散到任何地方 我想到了这样的事情(注意“工

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

可能有多个工作要并发执行,因此每个任务bean都需要是独立的(原型)

人们有没有共同的模式来实现这一点

在我看来,我需要以某种方式与容器/applicationContext进行交互,但我并不想将applicationContext/beanFactory的注入和对getBean(“…”)的调用分散到任何地方

我想到了这样的事情(注意“工厂”是我想象的东西,而不是存在的东西)



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

Spring本身并没有为您试图做的事情提供明确的支持。类似于
factory-method
XML属性和
FactoryBean
接口只对在其范围内一次性创建bean有用,如果您想按需创建它们,这意味着
scope=“prototype”
,这意味着使用
getBean()


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

我正在尝试做一件与此非常类似的事情(Spring 3.0),因此我很想听听您最终是如何解决这个问题的


我目前的方法是使用getBean(),我在Spring instatiated beans/POJO中使用了默认的单例作用域。因此,我现在有非线程安全的代码,但希望进一步改进它,使之成为线程安全的。

我明白你的意思,但它仍然不是一个很好的解决方案(我在上面提到过有一个工厂)。考虑MyTube是否对其他原型范围的bean有依赖性,每个bean都有它们自己的依赖项。我必须在工厂中制造所有这些组件(并将它们的依赖项注入我的工厂)并将它们传递给MyTask,或者让MyTask创建它们,并让工厂传递所有其他原型bean的依赖项。这一切感觉就像没有为单例使用spring一样,只是在本例中,它是为原型范围的bean使用的。我最终只是在相关bean上使用BeanFactoryAware,并根据需要调用getBean()来制造原型bean。我确信一个注释解决方案是完全可行的,但我认为这对我来说太过分了,因为我只需要一个非常大的应用程序的5-10个地方的功能。
<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;

}