假设我有以下课程:
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() motion.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() 时会起作用?这是否意味着尽管在 bean 定义类属性中明确定义了类类型,但 Spring 会将创建的 QuadripedalMovement 类分配给父字段而不是子字段?
如何配置 spring 以将其分配给(哺乳动物)子类的字段,以便我可以通过 Gorilla 的实例引用它?我无法修改 Animal 和 Gorilla 的 Java 代码。我只能修改 Mammal 类。我的临时解决方案是让 Mammal 实现 InitializingBean 并在那里设置移动值。
public void afterPropertiesSet() throws Exception {
this.movement = (QuadripedalMovement) super.movement;
}
但我最近才开始学习 Spring(和 Java),所以我不知道这是否正确(或良好做法)。任何帮助,将不胜感激。
注意:以上代码与我目前正在学习的代码结构相同。我无法提供原件。使用的spring版本是2.5.6