使用spring按需创建bean

我想在工厂模式启动后创建一些spring bean。 例如,每隔一段时间我就有一些工作要做,我需要创建一个任务bean(它可能依赖于其他单例弹簧bean)并执行它。

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

人们用它来实现这个目标吗?

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

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

  ...       

然后是代码

 class MyTaskExecutor { private Factory taskFactory; public void setTaskFactory( Factory taskFactory ) { this.taskFactory = taskFactory; } } 

也许是一个注释版本

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

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

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

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

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

感谢任何输入。

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

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

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

我正在尝试做一个非常相似的事情(Spring 3.0),所以我有兴趣听听你最终是如何解决这个问题的。

我目前的方法是使用getBean(),我已经使用我的Spring-instatiated beans / pojos使用默认的单例范围。 所以我现在有非线程安全的代码,但是想要改进它以使线程更安全。