Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧注射及;全局初始化对象_Java_Spring_Dependency Injection - Fatal编程技术网

Java 弹簧注射及;全局初始化对象

Java 弹簧注射及;全局初始化对象,java,spring,dependency-injection,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负责,程序的行为并不是预期的。(我希望列表总是空的,但由于某些原因,不能由方

我有弹簧注射服务

 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注入的服务时,关于使用成员变量/局部变量来提高性能和效率的最佳实践是什么

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

基础知识
.....

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

可能发生的情况是,您正在创建一个的多个实例。看看这里。引述:

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

因此,如果在Spring配置中没有指定
id
name
,则可能会创建
A
的多个实例

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


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

默认情况下,SpringBean是单例的。仅初始化一次,并反复使用同一对象

但是,如果需求按照您的要求发生变化。您需要理解Spring提供的scope属性

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

请参阅以下内容以了解详细信息。 范围说明

  • 独生子女

    将单个bean定义的范围限定为每个对象的单个对象实例 springioc容器

  • 原型

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

  • 请求

    将单个bean定义限定为单个HTTP的生命周期 要求也就是说,每个HTTP请求都有自己的 在单个bean定义的后面创建的bean的实例。 仅在支持web的Spring应用程序上下文的上下文中有效

  • 会议

    将单个bean定义限定为HTTP会话的生命周期。 仅在支持web的Spring应用程序上下文的上下文中有效

  • 全球会议

    将单个bean定义限定为全局HTTP的生命周期 一场通常仅在portlet上下文中使用时有效。只有 在支持web的Spring应用程序上下文的上下文中有效


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

Spring提供了许多初始化对象的方法;您读过Spring文档吗?如果它是一个单例,并且您只通过Spring创建对象,那么只有一个——这就是单例。好的,那么如果我在这里配置l到新列表?每个调用都会有一个空列表吗?不,它会有从值填充的值。。。