弹簧注射&全局初始化的对象

时间:2012-04-10 10:57:10

标签: java spring dependency-injection

我有弹簧注射服务

 class A{
      List l = new ArrayList();

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

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

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

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

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

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

更一般地说,春天注入的关于使用成员变量/局部变量来提高性能的服务的最佳实践是什么?效率

3 个答案:

答案 0 :(得分:2)

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

默认情况下,Spring bean是singleton。仅初始化一次并反复使用同一对象。

但是,如果要求按要求更改。您需要了解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

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

答案 1 :(得分:0)

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

<bean id = "serviceBeanA" class = "somepkg.A" scope="prototype">
    <property name = "l">
        <value>
            <list>
                 <value>ABC</value>
                 .....
            </list>
        </value>
    </property>
</bean>

答案 2 :(得分:0)

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

可能发生的事情是您创建了多个A个实例。请点击此处了解Spring singletons versus non。引用:

  

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

因此,如果您的Spring配置中未指定idname,则可能会创建多个A实例。

  

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