使用 JavaConfig 获取原型范围 Spring 组件的新实例
Get New Instance Of Prototype Scoped Spring Component Using JavaConfig
我想要一个 Spring 组件,其原型范围在运行时根据需要实例化,使用纯 Java 实现(Spring JavaConfig 注释)。
假设我有一个 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 文件)吗?
更新:
更具体地说,我正在寻找一种类似于
中解释的基于 xml 的查找方法工厂解决方案的方法
Scope 'prototype' 意味着每次调用 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()
我想要一个 Spring 组件,其原型范围在运行时根据需要实例化,使用纯 Java 实现(Spring JavaConfig 注释)。 假设我有一个 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 文件)吗?
更新:
更具体地说,我正在寻找一种类似于
Scope 'prototype' 意味着每次调用 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()