以下是我的Pojo:
public class Triangle implements ApplicationContextAware, BeanNameAware{
private Point pointA;
private Point pointB;
private Point pointC;
我的spring.xml结构在这里:
<bean id="pointA" class="com.betta.springtest.Point">
<property name="x" value="0" />
<property name="y" value="0" />
</bean>
<bean id="pointB" class="com.betta.springtest.Point">
<property name="x" value="-20" />
<property name="y" value="0" />
</bean>
<bean id="pointC" class="com.betta.springtest.Point">
<property name="x" value="20" />
<property name="y" value="0" />
</bean>
<bean id="triangle-bean" class="com.betta.springtest.Triangle" autowire="autodetect"/>
<alias name="triangle-bean" alias="triangle" />
我已经在POJO中实现了ApplciationContextAware和设置上下文。从上下文中获取bean之后,我更改了bean的一个属性(bean)的值。我再次从上下文中获取了新的子bean,但是我没有使用spring.xml中设置的值获取它。这是我的代码,任何人都可以告诉我这里是错的还是预期的行为?
public void draw(){
System.out.println("Point A "+this.pointA.getX()+" "+this.pointA.getY());
System.out.println("Point B "+this.pointB.getX()+" "+this.pointB.getY());
System.out.println("Point C "+this.pointC.getX()+" "+this.pointC.getY());
System.out.println("Changing the value of point B");
this.pointB.setX(0);
this.pointB.setY(0);
System.out.println(" After Changing the value of point B "+
this.pointB.getX()+" "+this.pointB.getY());
Point newPoint = (Point) this.context.getBean("pointB");
System.out.println("Restored value of point B "+
newPoint.getX()+" "+newPoint.getY());
}
在上面的代码中,我希望对象Point B具有在spring.xml中设置的值,这是我无法获得的。我是Spring的新手,任何人都可以帮助我理解这个概念吗?
答案 0 :(得分:1)
默认情况下,Spring bean是单例。这意味着每个应用程序上下文实例只有一个bean实例。如果您修改从应用程序上下文中检索的实例,则在再次检索它时仍会对其进行修改,因为只存在单个实例。
您可以使用原型bean作用域,这意味着每次从应用程序上下文中检索它时都会创建新的bean实例,在这种情况下代码的行为与您期望的一样。
<bean id="pointA" class="com.betta.springtest.Point" scope="prototype">
<property name="x" value="0" />
<property name="y" value="0" />
</bean>