【问题标题】:How do I force a spring container not to return a singleton instance of a bean?如何强制弹簧容器不返回 bean 的单例实例?
【发布时间】:2010-01-08 19:56:19
【问题描述】:

当我在 BeanFactory 上调用 getBean(name) 时,我会返回应用程序上下文中定义的 bean 实例。但是,当我再次调用getBean(name)(使用相同的名称)时,我得到了相同的bean 实例。我知道在某些(很多?)情况下这是多么可取,但我如何告诉BeanFactory 给我一个新实例?

Spring 配置示例(简而言之……我省略了一些冗长的内容,但这应该能说明问题):

<beans>
   <bean id="beanA" class="misc.BeanClass"/>
</beans>

Java 示例:

for(int i = 0;i++;i<=1) {
    ApplicationContext context = ClassPathXmlApplicationContext("context.xml");
    Object o = context.getBean("beanA");

    System.out.println(o.toString());  // Note: misc.BeanA does not implement 
                                       // toString(), so this will display the OOID
                                       // so that we can tell if it's the same
                                       // instance
}

当我运行它时,我会得到类似的东西:

misc.BeanClass@139894
misc.BeanClass@139894

请注意,两者都有相同的 OOID...所以这些是相同的实例...但我想要不同的实例。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    你需要告诉 spring 你想要一个原型 bean 而不是单例 bean

    <bean id="beanA" class="misc.BeanClass" scope="prototype"/>
    

    这将为您的每个请求提供一个新实例。

    【讨论】:

    • 做到了。有两件事让我出轨:1. 最初,我在寻找 getBean(String) 的参数,而不是配置中的属性... 2. 在 Spring 1.x(我以前的 Spring 经验)中,该属性被称为 '单例,但这显然在 2.5 中不起作用。
    • 是的,他们在 Spring 2.x 中将其更改为“范围”以适应请求、会话和全局会话。
    • 如果你是通过Java类(@Configuration)配置的,可以在bean定义方法中use @Scope("prototype")
    【解决方案2】:

    默认scope 为单例,但您可以将其设置为原型、请求、会话或全局会话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 2017-09-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多