Wiązanie automatyczne a dziedziczenie

0

Cześć,

Zgłębiam wiedzę na temat Springa i wiązania automatycznego.

Mamy w konfiguracji Spring:

<bean id="niceGirl" class="main.java.project.NiceGirl" autowire="constructor" />

<bean id="newDance" class="main.java.project.NewDance"/>

Klasa NiceGirl implementująca Girl:

public class NiceGirl extends Girl {
    private Dance dance;

    public NiceGirl(Dance dance) {
        super();
        this.dance = dance;
    }

    public NiceGirl(int x, **Dance dance**) {
        super(x);
        this.dance= dance;
    }

    public void perform() throws PerformanceException {
        super.walk();
        System.out.println("While dancing...");
        dance.dance();
    }
}

klasa NewDance implementująca Dance:

class NewDance implements Dance{
public NewDance(){}

public void dance(){
        System.out.println("new dancing...");
}
}

I teraz moje pytanie. Czy bean id="newDance" zostanie dowiazany do konstruktora? Jeśli tak to czemu? Przecież jest innym typem (tylko dziedziczy po Dance).

dodanie znaczników <code class="xml"> i <code class="java"> - @furious programming

0

Sam sobie odpowiedziałeś. NewDance JEST Dance i jak najbardziej pasuje jako kandydat do wstrzyknięcia. Ba, powiedziałbym że jest to nawet jeden ze sztandarowych przykładów na zastosowanie kontenera IoC tak w ogóle.

Wyobraź sobie że masz pewną klasę wykonującą jakiś generyczny algorytm, powiedzmy przepisujący dane z jednego formatu do drugiego. Taka klasa opiera się o dwa wstrzyknięte serwisy -> InputFileParser i OutputFileGenerator. Klasa opiera się tylko o te dwa interfejsy i nie zna żadnej implementacji (implementacja w ogóle może nie być w tej chwili dostępna). Użytkownik tej klasy musi jedynie zaimplementować sobie dwie klasy implementujące ten interfejs a następnie je wstrzyknąć i może uruchomić naszą klasę. Dzięki temu możesz sobie przez lata dopisywać wsparcie dla nowych formatów danych a jedyne co będziesz musiał przygotować to implementacje interfejsu dla danego typu danych i kontekst Springa który uruchomi aplikacje startując odpowiednie beany.

0

@Shalom no tak czułem, że samo sobie odpowiedziałem, ale dziwi mnie to trochę.

Że oczekuje się konkretnego typu ABC w konstruktorze i on wstrzyknie tam XXX implementujące/dziedziczące ABC. Ale przecież XXX może zawierać dużo więcej innych pól, metod itd. To jak to działa? :O Chodzi mi o pełne zrozumienie tego (bo przyjąć do wiadomości to to przyjąłem, że tak jest i tyle :) )

1

Nie bardzo rozumiem twoje pytanie. Mam wrażenie że zabrałeś się za Springa a nie rozumiesz podstaw Javy i OOP. Przecież to jest zupełnie normalne że klasę pochodną możesz zawsze wrzucić w miejsce klasy bazowej. To jedna z podstawowych zasad programowania obiektowego, Liskov Substitution Principle - https://en.wikipedia.org/wiki/Liskov_substitution_principle
Jest tak dlatego że relacja dziedziczenia oznacza "jest szczególnym przypadkiem". Samochód jest szczególnym przypadkiem Pojazdu, a Pies jest szczególnym przypadkiem Zwierzęcia. Jeśli twoja metoda czy klasa bazuje na poziomie abstrakcji takim jak Pojazd to znaczy że nie ma znaczenia jaki to będzie pojazd. Możemy tam wrzucić Rower a możemy Czołg.

Ja rozumiem że miliony cebulionów kuszą, ale nie da się zacząć od nauki Springa czy innych zabawek Enterprise jeśli nie masz solidnych podstaw z Javy i Programowania jako takiego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1