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

Spring Prototype scoped bean在单例中

从光启
2023-03-14

我试图在singletonbean中注入一个prototypebean,这样对singleton bean方法的每个新调用都有一个原型bean的新实例。

考虑一个单例bean,如下所示:

    @Component
    public class SingletonBean {
       @Autowired 
       private PrototypeBean prototypeBean;

       public void doSomething() {
         prototypeBean.setX(1);
         prototypeBean.display();
       }
    }

我希望每次调用doSomething()方法时,都会使用一个新的PrototypeBean实例。

下面是原型bean:

     @Component 
     @Scope(value="prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
     public class PrototypeBean {
        Integer x;

        void setX(Integer x) {
         this.x = x;
        }

        void display() {
          System.out.println(x);
        }
    }

似乎正在发生的是spring在doSomething()方法中过于急于移交PrototypeBean的一个新实例。也就是说,doSomething()方法中的两行代码在每一行中创建一个新的prototypeBean实例。

因此在第2行-prototypeBean.display()打印NULL。

此注入的配置中缺少什么?

共有1个答案

柳豪
2023-03-14

来自Spring文档:

您不需要将 与作用域为单例或原型的bean结合使用。如果尝试为单个bean创建作用域代理,则会引发BeanCreationException。

在3.2版本的文档中,您可以找到这句话:

似乎不希望您使用代理的原型bean,因为每次向BeanFactory请求它时,它都会创建一个新的实例。

为了为原型bean建立一种工厂,您可以使用objectFactory,如下所示:

@Component
public class SingletonBean {

    @Autowired
    private ObjectFactory<PrototypeBean> prototypeFactory;

    public void doSomething() {
        PrototypeBean prototypeBean = prototypeFactory.getObject();
        prototypeBean.setX(1);
        prototypeBean.display();
    }
}

并且您的原型bean将声明如下:

@Component 
@Scope(value="prototype")
public class PrototypeBean {
    // ...
}
 类似资料:
  • 问题内容: 这个问题不是为了讨论是否需要单例设计模式,是否是反模式,还是针对任何宗教战争,而是要讨论如何以最pythonic的方式在Python中最好地实现此模式。在这种情况下,我定义“最pythonic”表示它遵循“最小惊讶原则”。 我有多个将成为单例的类(我的用例用于记录器,但这并不重要)。当我可以简单地继承或修饰时,我不希望增加gumph来使几个类杂乱无章。 最佳方法: 方法1:装饰器 优点

  • 我使用Spring Boot创建了一个服务(微服务设计的一部分)。我有下面的方法, 我多次调用此方法,希望只维护一个实例并在创建后重用它。考虑到并发编程,我可以使用单例模式吗?根据下面的链接,我看到RestTemboard是非常好的方法,而不是Apache Http Client, RestTemplate与ApacheHTTP客户端在spring项目中的生产代码 非常感谢您的建议。

  • 单例 单例,多线程才是单例,在多进程单例无效,大家帮解释?

  • 问题内容: 谁能提供一个单例模式的示例并解释为什么有必要吗? 问题答案: 在走单身路线之前,请重新考虑。您真的需要单身人士吗?如果您需要实现单例的方案,那是因为对它们的需求并没有真正表达出来。您最好不要仅在代码库中引入单例,因为遵循设计模式会很酷。 干净的代码讨论-全局状态和单例 一次还不够 表演者单身人士 但是,真正值得了解的是Dependency Injection 。 现在,如果您真的想用J

  • 问题内容: weka是否要求测试实例具有class属性。我已经使用了一个训练集arff文件来训练分类器。现在,我想测试一个没有class属性的实例(不是从arf​​f文件,必须通过代码创建)并预测该类。我找到了此链接。Weka:如何在Java中获得测试实例的预测值? 但是我的课程属性是字符串“ Y”或“ N”。如果valuateModelOnce()返回double,那是什么意思。是class属性

  • 单例模式确保只创建一个类的实例。我如何在飞镖中建立这个?