我希望有一个Spring组件,其原型范围在运行时根据需要实例化,使用纯Java实现(Spring JavaConfig annotations)。 假设我有一个bean如下:
@Component
@Scope("prototype")
public class MyTask {
@Autowired
Field myField;
runTask() {...}
}
我希望能够做到以下几点:
MyTask task = //instantiate new task
task.runTask();
我总是可以使用:
ApplicationContext.getBean(MyTask.class)
但这完全违背了控制倒置的概念。 可以使用JavaConfig纯Java实现(即不使用xml文件)来完成吗?
更新
更具体地说,我正在寻找一种类似于this SO post
中解释的查找方法工厂的基于xml的解决方案的方法。答案 0 :(得分:2)
范围'原型'意味着每次调用beanFactory.getBean()
时,都会得到一个新的实例。当你注入依赖项时(例如,通过@Autowired),Spring(内部)每个注入点只调用getBean()
一次。
要多次调用,您需要BeanFactory
,或者只需在配置中调用@Bean
- 带注释的方法。
这里描述了一个有趣的@Configuration原型范围用例:Spring Java Config: how do you create a prototype-scoped @Bean with runtime arguments?
您可以在没有原型范围的情况下实现您所描述的内容。
@Component
public class MyTaskFactoryImpl implements MyTaskFactory {
@Autowired
Field myField;
@Override
public MyTask newTask() {
return new MyTask(myField);
}
}
在MyTask
:
public class MyTask {
final Field myField;
public MyTask(Field myField) {
this.myField = myField;
}
public void runTask() {...}
}
然后注入MyTaskFactory taskFactory
并使用它:
MyTask task = taskFactory.newTask();
task.runTask()