使用JavaConfig获取Prototype Scoped Spring组件的新实例

时间:2017-03-21 14:02:41

标签: java spring spring-java-config

我希望有一个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的解决方案的方法。

1 个答案:

答案 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()