配置子类字段的Spring属性,其名称与Parent

时间:2016-05-05 14:01:58

标签: java spring inheritance spring-properties member-hiding

假设我有以下类:

package wild;

import moco.GeneralMovement;

public class Animal{

    protected GeneralMovement movement;

    public getMovement (){
            return movement;
    }
    public void setMovement (GeneralMovement movement){
            this.movement = movement;
    }
}

package sur;

import loco.QuadripedalMovement;
import wild.Animal;

public class Mammal extends Animal{

    protected QuadripedalMovement movement;

    public QuadripedalMovement  getMovement (){
            return movement;
    }
    public void setMovement (QuadripedalMovement movement){
            this.movement = movement;
    }

    public void test(){
            super.movement.move();
    }

}

package zoo;

import sur.Mammal;

public class Gorilla extends Mammal{

    public void doSomething(){
        test();
        movement.grove();
    }
}

package moco;

public class GeneralMovement {

  public void move(){
  System.out.println("Moving");
  }
}

package loco;

import moco.GeneralMovement;

public class QuadripedalMovement extends GeneralMovement{

    public void grove(){
    System.out.println("Grooving...");
    }
}

import zoo.Gorilla;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {

    private ApplicationContext ctx;

    public static void main(String[] args) {
        Test test =  new Test();
        test.doProcess();
    }
    public void doProcess(){
        String cfgFiles[] = {"zoo.xml"};
        ctx = new ClassPathXmlApplicationContext(cfgFiles);
        Gorilla gorilla = (Gorilla) ctx.getBean("Gorilla");
        gorilla.doSomething();

    }
}

然后是以下XML配置:

    <bean id="Gorilla" class="zoo.Gorilla">
        <property name="movement">
            <ref bean="QuadripedalMovement"/>
        </property>
    </bean>

    <bean id="QuadripedalMovement" class="loco.QuadripedalMovement" />
</beans>

上面会在调用doSomething()movement.grove()时给出NullPointerException。

Moving
Exception in thread "main" java.lang.NullPointerException
    at zoo.Gorilla.doSomething(Gorilla.java:9)
    at Test.doProcess(Test.java:64)
    at Test.main(Test.java:49)

根据我从一点研究中所理解的,这与Java无法覆盖领域有关。以上(如果我的理解错误,请纠正我)实际上会引用两个(?)不同的字段。

为什么上述代码在使用super关键字调用move()时有效?这是否意味着Spring会将创建的QuadripedalMovement类分配给父字段而不是子字段,尽管在bean定义类属性中明确定义了类类型?

如何配置spring以将其分配给(Mammal)子类&#39;字段,所以我可以通过大猩猩的实例引用它?我无法修改Animal和Gorilla的Java代码。我只能修改哺乳动物类。我的临时解决方案是让Mammal实现InitializingBean并在那里设置移动值。

public void afterPropertiesSet() throws Exception {
  this.movement = (QuadripedalMovement) super.movement;
}

但我最近才开始学习Spring(和Java),所以我不知道这是否正确(或良好实践)。任何帮助将不胜感激。

注意:上面的代码与我目前正在研究的代码结构相同。我不能提供原件。使用的弹簧版本是2.5.6

0 个答案:

没有答案
相关问题