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