使用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使用默认的单例范围。 所以我现在有非线程安全的代码,但是想要改进它以使线程更安全。