从上下文感知检索的应用程序上下文中未正确生成Bean

时间:2014-12-03 04:17:04

标签: spring dependency-injection applicationcontext

以下是我的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的新手,任何人都可以帮助我理解这个概念吗?

1 个答案:

答案 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>