【问题标题】:How long does an spring initialized bean live?一个spring初始化的bean能活多久?
【发布时间】:2015-09-22 20:44:09
【问题描述】:

当我在服务器上运行 bean 方法的第一个请求(比如说方法 A)时,一切似乎都正常,但是当第二次运行这个载体RESTWS bean 上的任何请求时(比如说方法 B),正在使用的 dao是同一个carrierDAO实例。每次调用此 carrierRESTWS bean 时,如何避免出现此问题并让注入使用新的 dao 实例?

xml 文件中的 Beans 配置:

<bean id="carrierRESTWS" class="ar.com.anovo.controllers.rest.CarrierRESTWS">
        <property name="carrierDAO" ref="carrierDAO"/>
 </bean>

<bean id="carrierDAO" class="ar.com.anovo.dao.CarrierDAO"></bean>

【问题讨论】:

  • 为什么需要非单例 DAO?

标签: java spring spring-ioc spring-rest


【解决方案1】:

将“carrierDAO”的范围设置为“prototype”:

<bean id="carrierDAO" class="ar.com.anovo.dao.CarrierDAO" scope="prototype" />

一旦需要注入,这将创建一个新实例。

有关范围的更多信息,请参阅Spring Doc

【讨论】:

    【解决方案2】:

    您的 bean 是单例 bean,因此它们的寿命与 Spring 容器的寿命一样长,这基本上意味着只要您的程序正在运行,这再次意味着只要您的 webapp 正在运行,理论上可能是几年.

    由于您的控制器和 DAO 类当然被编码为无状态并支持多线程,因此您应该不会对单个共享实例有任何问题。

    【讨论】:

      【解决方案3】:

      spring 中的默认作用域是singleton,因此您需要显式设置每次创建一个新实例的作用域,正如@Stefan 用prototype 指示的那样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-20
        相关资源
        最近更新 更多