Der Inhalt dieses Artikels befasst sich mit der Simulation und Implementierung der Java Spring-Abhängigkeitsinjektion (Bilder und Texte). Ich hoffe, dass er für Sie hilfreich ist. .
Abhängigkeitsinjektion – Abhängigkeitsinjektion wird im Java Spring-Framework häufig verwendet. Durch die Abhängigkeitsinjektion müssen wir abhängige Ressourcen nicht mühsam im Anwendungscode initialisieren, was sehr praktisch ist.
Kann ABAP also auch die Abhängigkeitsinjektion auf Sprachebene unterstützen und den Komfort dieser Designidee genießen? Lass es uns versuchen.
Eine Szene zum Ausprobieren
Im wirklichen Leben verfügt jedes Licht über eine Schaltersteuerung. Drücken Sie den Schalter und das Licht wird eingeschaltet; drücken Sie ihn erneut und das Licht erlischt.
Sehen wir uns nicht die herkömmliche Implementierung mit Abhängigkeitsinjektion an:
Entwerfen Sie eine ABAP-Schnittstelle ZIF_SWITCHABLE und stellen Sie zwei Methoden bereit, die jeweils dem Ein- und Ausschalten entsprechen.
Natürlich habe ich eine ABAP-Klasse ZCL_LAMP, die die obige Schnittstelle implementiert. Jede Instanz von ZCL_LAMP ist eine Lampe.
CLASS ZCL_LAMP IMPLEMENTATION. method ZIF_SWITCHABLE~OFF. WRITE: / 'lamp off'. endmethod. method ZIF_SWITCHABLE~ON. WRITE: / 'lamp on'. endmethod. ENDCLASS.
Entwerfen Sie eine Switch-Klasse. Diese Klasse verfügt über eine Mitgliedsvariable mo_switchable, die auf die ZIF_SWITCHABLE-Schnittstelle verweist.
Der Schalter verfügt über eine „Drück“-Methode. Wenn nach dem Drücken der aktuelle Status „Ein“ ist, rufen Sie die Methode „Aus“ des Mitglieds „mo_switchable“ auf, um es auszuschalten, und setzen Sie den Status des Schalters auf „Aus“. umgekehrt.
METHOD push. IF isswitchon = abap_true. mo_switchable->off( ). isswitchon = abap_false. ELSE. mo_switchable->on( ). isswitchon = abap_true. ENDIF. ENDMETHOD.
stellt eine Setter-Methode bereit, um die eingehende Variable vom Typ ZIF_SWITCHABLE in die Mitgliedsvariable mo_switchable einzufügen.
method SET_SWITCHABLE. mo_switchable = io_switchable. endmethod.
Ich habe die beiden Klassen, die ich bisher erstellt habe: ZCL_LAMP und ZCL_SWITCH, in das Paket $ZDEV_INVERSION eingefügt.
Verbrauchscode des ABAP Summer Frameworks
Wie aus dem folgenden Code ersichtlich ist, ZCL_SWITCH und ZCL_LAMP erzeugt eine starke Abhängigkeit. Diese Abhängigkeit wird vom Anwendungsentwickler manuell durch Aufrufen der Set-Methode eingefügt.
Zusammenfassend lässt sich sagen, dass es einige Aspekte des Codes in der obigen Abbildung gibt, die in Java Spring durch die Idee der Abhängigkeit vollständig vermieden werden können Injektion.
Zeile 8: Erstellen Sie manuell eine Instanz von ZCL_LAMP (Licht).
Zeile 9: Erstellen Sie manuell eine Instanz von ZCL_SWITCH (Schalter).
Zeile 11: Rufen Sie die Set-Methode auf, um die Abhängigkeiten von Lichtern und Schaltern manuell einzufügen.
Verwendung des ABAP Summer-Frameworks zur Implementierung der Abhängigkeitsinjektion
Ich habe ABAP verwendet, um das Java Spring-Abhängigkeitsinjektions-Framework zu simulieren, und einen Prototyp namens ABAP Summer entwickelt, der kompatibel ist mit Java Spring-Echos.
Überlegen Sie sich zunächst, wie Sie dieses einfache Beispiel mit Java Spring umsetzen können. Ein Java-Programmierer kann problemlos den folgenden Code schreiben. Mit der @Inject-Annotation von Spring müssen wir ISwitchable nicht manuell instanziieren und die Set-Methode aufrufen, um Abhängigkeiten herzustellen. Bei uns wird alles durch das Spring-Framework umgesetzt.
Wie kann man nun ABAP verwenden, um diese „Magie“ zu erreichen?
1. Fügen Sie die Annotation @Inject im Beschreibungsfeld der Mitgliedsvariablen mo_switchable der ZCL_SWITCH-Klasse hinzu. Die Absicht besteht darin, dem ABAP Summer-Framework mitzuteilen, dass ich hoffe, dass das mo_switchable-Mitglied automatisch mit einem korrekten Wert injiziert werden kann Abhängigkeit. Welche Art von Abhängigkeit ist richtig? Woher weiß das Summer-Framework, wie es einspritzt? Bitte lesen Sie weiter.
Hinweis: Die ABAP-Sprache unterscheidet sich von Java und kann keine Annotationen auf Sprachebene unterstützen, daher ist hier das im Beschreibungsfeld gepflegte @Inject vorhanden nur eine Simulation.
2. Schauen wir uns zunächst den ABAP-Verbrauchscode an, nachdem er die Abhängigkeitsinjektion verwendet hat. Fühlt er sich plötzlich viel sauberer an?
data(summer) = zcl_summer=>get_instance( ). data(lo_switch) = cast zcl_switch( summer->get_bean( EXPORTING iv_bean_name = 'ZCL_SWITCH' ) ). lo_switch->push( ). lo_switch->push( ).
Die folgende Abbildung ist ein Vergleich zweier Sätze von Verbrauchercodes, die auf der konventionellen ABAP-Implementierung und der Idee der ABAP-Abhängigkeitsinjektion basieren. Es ist deutlich zu erkennen, dass nach der Einführung der ABAP-Abhängigkeitsinjektion
Die drei zuvor genannten manuellen Eingriffe entfallen komplett. Die Mitgliedsvariable mo_switchable in der von der GET_BEAN-Methode zurückgegebenen Switch-Instanz enthält die automatisch eingefügte Instanz der ZCL_LAMP-Klasse.
Zeile 8: Erstellen Sie manuell eine Instanz von ZCL_LAMP (Licht).
Zeile 9: Erstellen Sie manuell eine Instanz von ZCL_SWITCH (Schalter).
Zeile 11: Rufen Sie die Set-Methode auf, um die Abhängigkeiten von Lichtern und Schaltern manuell einzufügen.
Lassen Sie uns noch einmal einen Blick auf den authentischen Verbrauchscode in Java Spring werfen, um sicherzustellen, dass der von uns erfundene ABAP Summer tatsächlich die ursprüngliche Abhängigkeitsinjektion ist.
Das Implementierungsprinzip der ABAP Summer-Abhängigkeitsinjektion
Die Implementierung dieses ABAP-Abhängigkeitsinjektions-Frameworks ist in meinem On github:
https://github.com/i042416/je...
Über Java Spring Dependency Injektion Erklären Sie, es gibt viele wunderbar geschriebene Bücher im Internet.
Das Folgende ist die Kernimplementierung der ABAP Summer-Abhängigkeitsinjektion und bezieht sich auf die Erklärung von Java Spring im obigen Buch.
Das obige ist der detaillierte Inhalt vonSo simulieren und implementieren Sie die Java Spring-Abhängigkeitsinjektion in ABAP (Bild und Text). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!