Feder lose gekuppeltes Beispiel
Das Konzept der Objektorientierung ist ein gutes Konzept, um Ihr System in eine Gruppe wiederverwendbarer Objekte zu unterteilen. Wenn das System jedoch größer wird, insbesondere in Java-Projekten, sind die großen Objektabhängigkeiten immer eng miteinander verbunden, sodass Objekte nur sehr schwer verwaltet oder geändert werden können. In diesem Szenario können Sie Spring Framework als zentrales Modul verwenden, um alle Objektabhängigkeiten einfach und effizient zu verwalten.
Beispiel für einen Ausgabegenerator
Angenommen, Ihr Projekt verfügt über eine Funktion zum Ausgeben des Inhalts im Csv- oder Json-Format. Ihr Code könnte wie folgt aussehen:
Datei: IOutputGenerator.java - Eine Schnittstelle für den Ausgabegenerator
package com.example.output; public interface IOutputGenerator { public void generateOutput(); }
Datei: CsvOutputGenerator.java - Ein Csv-Ausgabegenerator zum Implementieren der IOutputGenerator-Schnittstelle.
package com.example.output.impl; import com.example.output.IOutputGenerator; public class CsvOutputGenerator implements IOutputGenerator { public void generateOutput(){ System.out.println("Csv Output Generator"); } }
Datei: JsonOutputGenerator.java - Ein Json-Ausgabegenerator zum Implementieren der IOutputGenerator-Schnittstelle.
package com.example.output.impl; import com.example.output.IOutputGenerator; public class JsonOutputGenerator implements IOutputGenerator { public void generateOutput(){ System.out.println("Json Output Generator"); } }
Es gibt verschiedene Möglichkeiten, den IOutputGenerator aufzurufen und Spring zu verwenden, um zu vermeiden, dass Objekte eng miteinander verbunden werden.
1. Methode 1 - Rufen Sie es direkt auf
Normalerweise rufen Sie es direkt an.
package com.example.common; import com.example.output.IOutputGenerator; import com.example.output.impl.CsvOutputGenerator; public class App { public static void main( String[] args ) { IOutputGenerator output = new CsvOutputGenerator(); output.generateOutput(); } }
Problem
Auf diese Weise besteht das Problem darin, dass der „Ausgang“ eng mit dem CsvOutputGenerator verbunden ist. Jede Änderung des Ausgabegenerators kann eine Codeänderung beinhalten. Wenn dieser Code über Ihr gesamtes Projekt verteilt ist, werden Sie bei jeder Änderung des Ausgabegenerators ernsthaft darunter leiden.
Methode 2 - Rufen Sie es mit Hilfsklasse auf
Möglicherweise möchten Sie eine Hilfsklasse erstellen, um die gesamte Ausgabeimplementierung darin zu verschieben.
package com.example.output; import com.example.output.IOutputGenerator; import com.example.output.impl.CsvOutputGenerator; public class OutputHelper { IOutputGenerator outputGenerator; public OutputHelper(){ outputGenerator = new CsvOutputGenerator(); } public void generateOutput(){ outputGenerator.generateOutput(); } }
Nennen Sie es über Helfer-Klasse.
package com.example.common; import com.example.output.OutputHelper; public class App { public static void main( String[] args ) { OutputHelper output = new OutputHelper(); output.generateOutput(); } }
Problem
Dies sieht eleganter aus, und Sie müssen nur eine einzelne Hilfsklasse verwalten. Die Hilfsklasse ist jedoch immer noch eng mit CsvOutputGenerator verbunden. Jede Änderung des Ausgabegenerators erfordert immer noch geringfügige Codeänderungen.
Methode 3 - Frühling
In diesem Szenario ist Spring Dependency Injection (DI) eine gute Wahl. Durch die Feder kann Ihr Leistungsgenerator lose mit dem Leistungsgenerator verbunden werden.
Kleinere Änderung in der OutputHelper-Klasse.
package com.example.output; import com.example.output.IOutputGenerator; public class OutputHelper { IOutputGenerator outputGenerator; public void generateOutput(){ outputGenerator.generateOutput(); } public void setOutputGenerator(IOutputGenerator outputGenerator){ this.outputGenerator = outputGenerator; } }
Erstellen Sie eine Spring Bean-Konfigurationsdatei und deklarieren Sie hier alle Ihre Java-Objektabhängigkeiten.
Nennen Sie es über Frühling
package com.example.common; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.example.output.OutputHelper; public class App { public static void main( String[] args ) { ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"Spring-Common.xml"}); OutputHelper output = (OutputHelper)context.getBean("OutputHelper"); output.generateOutput(); } }
Jetzt müssen Sie nur noch die Spring-XML-Datei für einen anderen Ausgabegenerator ändern. Wenn sich die Ausgabe ändert, müssen Sie nur die Spring-XML-Datei ändern. Kein geänderter Code bedeutet weniger Fehler.
Fazit
Das Spring Framework - Dependency Injection (DI) ist eine nützliche Funktion für die Verwaltung von Objektabhängigkeiten. Es ist einfach elegant, hochflexibel und erleichtert die Wartung, insbesondere in großen Java-Projekten.