Also, ich versuche es mal zu erklären.
also ich habe ein Klasse, die mir Kunden anlegt, bearbeiten und löschen kann (normal eigentlich nen Interface und dann ne Klasse die das implementiert, hier mal sofort als Klasse)
[HIGHLIGHT="Java"]public class KundenService {
//die ganzen Methoden
}[/HIGHLIGHT]
Es gibt jetzt eine GUI die drauf zugreift, bzw genauer gesagt ein Model
[HIGHLIGHT="Java"]public class KundenModel {
private KundenService kundenService = ServiceLocator.getInstance().getKundenService();
//restliche Methoden
}[/HIGHLIGHT]
So würde ich den KundenService da rein holen ohne DI (ServiceLocator ist mein Singleton) und das Model könnte ich einfach im Controller erstellen und auch der View übergeben:
[HIGHLIGHT="Java"]public class KundenController {
private KundenModel model;
private KundenView view;
public KundenController() {
model = new KundenModel();
view = new KundenView(model);
}
}[/HIGHLIGHT]
So ist alles schön und gut, außer das Singleton
Jetzt machen wir es mit DI. Der KundenService bleibt gleich, das erste was sich ändert wäre das KundenModel:
[HIGHLIGHT="Java"]public class KundenModel {
@Autowire
private KundenService kundenService;
//restliche Methoden
}[/HIGHLIGHT]
So und jetzt habe ich folgendes Problem. Da es eine DI in KundenModel gibt, muss diese Klasse über den ApplicationContext(AC) von Spring erstellt werden. Und folgendes ist nicht mehr möglich:
[HIGHLIGHT="Java"]public class KundenController {
private KundenModel model;
private KundenView view;
public KundenController() {
model = new KundenModel(); // hier brauch ich die Instanz aus dem AC
view = new KundenView(model);
}
}[/HIGHLIGHT]
nur wie komme ich da jetzt dran? Durch den AC
[HIGHLIGHT="Java"]model = context.getBean("kundenModel");[/HIGHLIGHT]
doch den Context habe ich hier gar nicht(weil ich ihn nicht durchreichen will). Also wäre die andere möglichkeit wieder DI. Aber da taucht wieder ein Problem auf.
[HIGHLIGHT="Java"]public class KundenController {
@Autowire
private KundenModel model;
private KundenView view;
public KundenController() {
view = new KundenView(model); // das model gibt es hier noch nicht
}
}[/HIGHLIGHT]
also müsste ich auch KundeView im AC von Spring erstellen. Nur ich finde es irgendwie unschön, GUI in diesem zu erstellen. Aber gehen wir den Prozess mal weiter:
[HIGHLIGHT="Java"]public class KundenController {
@Autowire
private KundenModel model;
@Autowire
private KundenView view;
public KundenController() {
}
}[/HIGHLIGHT]
Also die View wird auch über den AC erstellt und das Model wird ihm auch über DI übergeben.
Da es in KundenController wieder DIs gibt, muss ich ihn auch über den Spring AC erstellen. Damit andere auf diesen KundenController zugreifen können, müssen die wieder über den AC ran, der ja nicht in den Klassen vorhanden ist (ich will den nicht durchgeben, nur in der Main Methode haben). Also ist die einzige möglichkeit wieder über DI. Im besten Fall brauch in den KundenController nur noch in dem MainController meiner Applikation, im schlimmsten fall irgendwo in einer "tieferen" Klasse(MainController -> irgendeineKlasse -> damitNochBlöderWirdNochEIne -> KundenController ("->" soll heißen, dass die linke Klasse ne Referenz hat auf die rechte)), so dass ich noch mehrfach DIs brauche und es kann doch nicht sein, dass man mit Spring dann die ganze Applikation instanziert oder etwa doch? Zumindest bei der GUI scheint es mir unschön. Oder wie macht man es richtig?