当前位置: 首页 > 面试题库 >

如何强制弹簧容器不返回bean的单例实例?

於炯
2023-03-14
问题内容

当我调用getBean(name)BeanFactory,我获得了在应用程序上下文中定义的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 …因此它们是相同的实例…但是我想要不同的实例。


问题答案:

您需要告诉spring您想要原型bean而不是单例bean

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

每个请求都会为您提供一个新实例。



 类似资料:
  • 问题内容: 假设我在Spring容器中定义了一个bean(例如BeanA),并且此bean被注入到对象中。(例如BeanAUser) 在运行时,我可以使用另一个bean实例替换spring容器中的原始BeanA吗?并且还将这个新的bean实例重新注入BeanAUser中以替换原始的BeanA吗? 问题答案: 使用代理可以轻松实现。创建接口的委派实现,并切换要委派的对象。

  • 假设我有一个spring bean我想在整个应用程序中使用,但是因为它是遗留代码,所以我不能在或任何类型的bean中使用它,因为这个类是在整个项目中手动实例化的,所以我不能在我想要的地方自动地使用它。 我如何为一个我想要重用的spring bean创建一个包装器类,配置如下,这样它除了返回在应用程序上下文中注册的bean的实例之外什么都不做? 基本上,我正在寻找类似的方法,如: 这样,在我想使用M

  • 问题内容: 我正在使用Oracle 11GR2,并且当varchar2字段为空时,在空字段上执行a 将显示在我的Eclipse控制台上。如何让它显示空字符串呢? 问题答案: 你的getter方法:

  • 问题内容: 我正在尝试建立一个请求过滤器,该过滤器仅在与字母e和数字的模式匹配时才会使用。但是我似乎无法使其正常工作。每次尝试使用正则表达式时,我都会不断收到400个错误。 如果仅使用以下内容,它“有效”,但还会捕获没有我不需要的数字的映射。 我尝试了以下组合。 问题答案: 根据文档,您必须使用。甚至有一个例子:

  • 问题内容: 返回一个类型列表。但是List是一个接口,那么如何实例化它呢?如果尝试并实例化一个类型化的列表,我会收到一条错误消息,指出这是不可能的。 编辑 没关系,我看到了怎么回事,只是被文档混淆了片刻。 问题答案: 这是一个不应该与混淆。它是数组的包装,这意味着您进行了任何更改,更改了原始数组,并且无法添加或删除条目。通常将其与ArrayList结合使用,例如

  • 问题内容: 返回一个类型列表。但是List是一个接口,那么如何实例化它呢?如果尝试并实例化一个类型化的列表,我会收到一条错误消息,指出这是不可能的。 编辑 没关系,我看到了怎么回事,只是被文档混淆了片刻。 问题答案: 这是一个不应该与混淆。它是数组的包装,这意味着您进行了任何更改,更改了原始数组,并且无法添加或删除条目。通常将其与ArrayList结合使用,例如