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到新列表?每个调用都会有一个空列表吗?不,它会有从值填充的值。。。