当前位置: 首页 > 知识库问答 >
问题:

使用JavaConfig获取原型范围Spring组件的新实例

贺靖
2023-03-14

我希望使用纯Java实现(Spring JavaConfig注释),在运行时根据需要实例化一个具有原型作用域的Spring组件。假设我有一个bean,如下所示:

@Component
@Scope("prototype")   
public class MyTask {

    @Autowired
    Field myField;

    runTask() {...}
}

我希望能够做到以下几点:

MyTask task = //instantiate new task
task.runTask();
ApplicationContext.getBean(MyTask.class)

共有1个答案

田晨
2023-03-14

作用域'prototype'意味着每次调用BeanFactory.getBean()时,都会得到一个新的实例。当您注入依赖项时(例如,通过@autowired),Spring(在内部)每个注入点只调用getbean()一次。

要多次调用它,需要一个BeanFactory,或者在配置中调用带注释的@bean方法。

这里描述了一个使用@configuration的原型范围的有趣用例:Spring Java config:如何使用运行时参数创建一个原型范围的@bean?

@Component
public class MyTaskFactoryImpl implements MyTaskFactory {
    @Autowired
    Field myField;

    @Override
    public MyTask newTask() {
        return new MyTask(myField);
    }
}
public class MyTask {

    final Field myField;

    public MyTask(Field myField) {
        this.myField = myField;
    }

    public void runTask() {...}
}

然后注入MyTaskFactorytaskFactory并使用它:

MyTask task = taskFactory.newTask();
task.runTask()
 类似资料:
  • 问题内容: 我有一个名为Bar的类,带有以下注释: 在私人成员上,我具有以下注释: 在春季配置中,我有一个Foo类的bean。如果用它定义的bean 不起作用,则出现以下异常: NoSuchBeanDefinitionException:找不到依赖项为Foo的匹配bean:期望至少有1个有资格作为此依赖项的自动装配候选的bean 一旦我将注入的bean作用域更改为正常工作。 是否自动布线原型作用域

  • 嗯,很可能没有任何谜团,但我只是不够聪明,不知道我的问题是什么。然而,通常它毕竟是谜团! 很抱歉进行介绍,我的问题是原型范围似乎不适合我。我创建了一个带有Spring集成流的REST服务(流前面有一个http入站网关)。大多数bean的作用域都是原型。我通过使用线程调用它十次来测试流。此外,我还记录了bean引用(只需在被调用的对象中打印“this”),并且我看到了十次相同的引用! 据我所知,这意

  • 我在Spring重新认识了豆子的不同范围。 每次我在xml中创建bean时,我都从未使用scope属性,这意味着它是单例的。" 对于原型,我读到“有状态bean首选原型范围” 有状态bean是什么意思?谁能给我一个实时的例子,我们在哪里有原型范围?

  • 问题内容: 假设两个类为ClassA和ClassB。假设ClassB依赖于ClassA。在配置文件中,如果将ClassA的范围定义为单例,将ClassB的范围定义为Prototype,那么每次创建ClassA的bean实例时,ClassB的实例会发生什么?每次返回ClassA实例时,将返回相同的ClassB实例还是创建新实例? 谢谢!!! 问题答案: 如果ClassB是原型,则始终创建ClassB

  • 我正在使用 Spring 3.1.1,在我的业务逻辑中,我有一个循环,每次迭代都需要一个新的 Spring bean(原型范围)实例。 最好的方法是什么?我是否必须创建自己的 BeanFactory 类,我可以将其注入一次到我的类中,并且每次都调用它来生成 bean?在查看 Spring 3 文档时,它似乎暗示我应该改用 ApplicationContext。但是,使用ApplicationCon