使用 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()