Настройте свойство 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

0 ответов

Другие вопросы по тегам