Настройте свойство Spring поля подкласса с тем же именем, что и у родителя
Предположим, у меня есть следующие классы:
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>
Выше приведено исключение NullPointerException при вызове doSomething() motion.grove().
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 не может переопределять поля. Выше (пожалуйста, поправьте меня, если мое понимание неверно) на самом деле относится к двум (?) Различным полям.
Почему вышеуказанный код работает, когда move() вызывается с помощью ключевого слова super? Означает ли это, что Spring присваивает созданный класс QuadripedalMovement родительскому полю, а не дочернему, несмотря на то, что тип класса явно определен в атрибуте класса определения компонента?
Как мне сконфигурировать Spring, чтобы назначить его полю (Mammal) подкласса, чтобы я мог ссылаться на него через экземпляр Gorilla? Я не могу изменить код Java для Animal и Gorilla. Я могу только изменить класс Млекопитающих. Мое временное решение - позволить Mammal реализовать InitializingBean и установить там значение перемещения.
public void afterPropertiesSet() throws Exception {
this.movement = (QuadripedalMovement) super.movement;
}
Но я только недавно начал изучать Spring (и Java), поэтому я не знаю, правильно ли это (или хорошая практика). Любая помощь будет оценена.
Примечание: приведенный выше код имеет ту же структуру, что и код, который я сейчас изучаю. Я не могу предоставить оригинал. Используемая версия пружины 2.5.6