0

我有一个弹簧注入服务

 class A{
      List l = new ArrayList();

      public m1(){
           //do some additions in list 
      }

      public m2(){
           //do some new additions in list
      }
 }

现在因为创建 , 的对象A是在 spring 的手中,所以程序的行为不是预期的。(我希望列表始终为空,但由于某些有线原因没有被方法初始化)

Spring 将始终只创建一个实例A,因此该列表l将继续增长,我已在应用程序上下文中将 bean 配置为单例。

如果是,自然我必须初始化函数内的列表m1&m2或被调用者必须超过引用,在我的情况下,被调用者是 struts2 动作,它们不是单例的,所以这个问题可以解决吗?

或者

spring 是否在配置中提供任何支持以在每次调用或其他情况下初始化成员变量?

更一般地说,在编写 Spring 注入的服务时,关于使用成员变量/局部变量来提高性能和效率的最佳实践是什么。

4

3 回答 3

2

试图回答以下问题:spring 是否在配置中提供任何支持以在每次调用或其他时初始化成员变量?

默认情况下,Spring bean 是单例的。仅初始化一次并一次又一次地使用相同的对象。

但是,如果要求按照您的要求更改。您需要了解 Spring 提供的范围属性。

<bean id="id" class="com.test.TP" scope="prototype">
</bean>

详细了解请参考以下内容。范围说明

  • 单身人士

    将单个 bean 定义限定为每个 Spring IoC 容器的单个对象实例。

  • 原型

    将单个 bean 定义限定为任意数量的对象实例。

  • 要求

    将单个 bean 定义限定为单个 HTTP 请求的生命周期;也就是说,每个 HTTP 请求都将有自己的 bean 实例,该实例是在单个 bean 定义的后面创建的。仅在 Web 感知 Spring ApplicationContext 的上下文中有效。

  • 会议

    将单个 bean 定义限定为 HTTP 会话的生命周期。仅在 Web 感知 Spring ApplicationContext 的上下文中有效。

  • 全球会议

    将单个 bean 定义限定为全局 HTTP 会话的生命周期。通常仅在 Portlet 上下文中使用时才有效。仅在 Web 感知 Spring ApplicationContext 的上下文中有效。

http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s04.html

也可以有用户定义的范围,例如线程范围。

于 2012-04-12T11:23:26.160 回答
0

您可以按如下方式配置您的 bean:-

<bean id = "serviceBeanA" class = "somepkg.A" scope="prototype">
    <property name = "l">
        <value>
            <list>
                 <value>ABC</value>
                 .....
            </list>
        </value>
    </property>
</bean>
于 2012-04-10T11:05:45.240 回答
0

我不确定我是否理解这个问题,但你的示例类应该可以在 spring 中正常工作。除非您在配置文件中传入构造函数参数,否则 Spring 将调用默认构造函数。只要您id="..."在 bean 中有一个,那么它将创建该类的单例。然后,第一个调用的类a.m1()l被视为一个空列表。

可能发生的情况是您有多个A正在创建的实例。请参阅此处了解Spring 单例与非. 去引用:

bean 被定义为以两种模式之一部署:单例或非单例。(后者也被称为原型,尽管该术语使用松散,因为它不太合适)。当 bean 是单例时,将只管理 bean 的一个共享实例,并且所有对具有 id 或 id 与该 bean 定义匹配的 bean 的请求将导致返回一个特定的 bean 实例。

因此,如果您的 Spring 配置中没有idorname指定,那么您可能会得到多个Acreated 实例。

bean 部署的非单例原型模式导致每次完成对该特定 bean 的请求时都会创建一个新的 bean 实例。这是理想的情况,例如每个用户需要一个独立的用户对象或类似的东西。

于 2012-04-10T12:47:00.763 回答