it-swarm.com.de

Was ist Abhängigkeitsinjektion und Inversion der Steuerung in Spring Framework?

"Dependency Injection" und "Inversion of Control" werden häufig als Hauptvorteile der Verwendung des Spring-Frameworks zur Entwicklung von Web-Frameworks genannt

Könnte jemand erklären, was es in sehr einfachen Worten mit einem Beispiel ist, wenn möglich?

99
Chillax
  • Spring hilft bei der Erstellung von lose gekoppelten Anwendungen aufgrund von Dependency Injection .
  • In Spring definieren Objekte ihre Assoziationen (Abhängigkeiten) und kümmern sich nicht darum, wie sie diese Abhängigkeiten erhalten. Es liegt in der Verantwortung von Spring, die erforderlichen Abhängigkeiten zum Erstellen von Objekten bereitzustellen.

Zum Beispiel : Angenommen, wir haben ein Objekt Employee und es besteht eine Abhängigkeit von Objekt Address. Wir definieren eine Bean, die Employee entspricht und deren Abhängigkeit vom Objekt Address definiert.

Wenn Spring versucht, ein Employee - Objekt zu erstellen, wird festgestellt, dass Employee von Address abhängig ist. Daher wird zuerst das Address - Objekt erstellt (abhängig) Objekt) und dann in das Objekt Employee einfügen.

  • Inversion der Kontrolle ( [~ # ~] ioc [~ # ~] ) und Abhängigkeitsinjektion ( [~ # ~] di [~ # ~] ) werden synonym verwendet. IOC wird durch DI erreicht. DI ist der Prozess der Bereitstellung der Abhängigkeiten und IOC ist das Endergebnis von DI. ( Hinweis: DI ist nicht der einzige Weg, IOC zu erreichen. Es gibt auch andere Wege .)

  • Durch DI wird die Verantwortung für das Erstellen von Objekten von unserem Anwendungscode auf den Spring-Container verlagert. Dieses Phänomen wird als IOC bezeichnet.

  • Die Abhängigkeitsinjektion kann durch Setterinjektion oder Konstruktorinjektion erfolgen.
207

Ich werde mein einfaches Verständnis dieser beiden Begriffe aufschreiben:

For quick understanding just read examples*

Abhängigkeitsinjektion (DI):
Abhängigkeitsinjektion bedeutet im Allgemeinen , dass ein abhängiges Objekt als Parameter an eine Methode übergeben wird, anstatt dass die Methode das abhängige Objekt erstellt .
In der Praxis bedeutet dies, dass die Methode nicht direkt von einer bestimmten Implementierung abhängig ist. Jede Implementierung, die die Anforderungen erfüllt, kann als Parameter übergeben werden.

Mit dieser Implementierung definieren Objekte ihre Abhängigkeiten. Und der Frühling macht es verfügbar.
Dies führt zu einer locker gekoppelten Anwendungsentwicklung.

Quick Example:EMPLOYEE OBJECT WHEN CREATED,IT WILL AUTOMATICALLY CREATE ADDRESS OBJECT (if address is defines as dependency by Employee object)*.<br>

Inversion des Kontrollcontainers (IoC):
Dies ist ein gemeinsames Merkmal von Frameworks. IOC verwaltet Java Objekte
- von der Instantiierung zur Zerstörung durch seine BeanFactory.
- Java-Komponenten, die vom IoC-Container instanziiert werden, werden als Beans bezeichnet, und der IoC-Container verwaltet den Gültigkeitsbereich, die Lebenszyklusereignisse und alle AOP-Funktionen , für die er erstellt wurde wurde konfiguriert und codiert.

QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it.

Durch die Implementierung von Inversion of Control erhält ein Software-/Objektverbraucher mehr Steuerelemente/Optionen für die Software/Objekte, anstatt gesteuert zu werden oder weniger Optionen zu haben.

Die Umkehrung der Kontrolle als Konstruktionsrichtlinie dient folgenden Zwecken:

Die Ausführung einer bestimmten Aufgabe ist von der Ausführung entkoppelt.
Jedes Modul kann sich auf das konzentrieren, wofür es entwickelt wurde.
Module machen keine Annahmen darüber, was andere Systeme tun, sondern verlassen sich auf ihre Verträge.
Das Ersetzen von Modulen hat keine Nebenwirkungen auf andere Module
Ich werde die Dinge hier abstrakt halten. Sie können die folgenden Links besuchen, um detaillierte Informationen zum Thema zu erhalten.
Eine gute Lektüre mit Beispiel

Detaillierte Erklärung

25
VdeX

Umkehrung der Kontrolle (IOC):

IoC ist ein Entwurfsmuster, das die Umkehrung des Kontrollflusses in einem System beschreibt, sodass der Ausführungsfluss nicht durch einen zentralen Code gesteuert wird. Dies bedeutet, dass Komponenten nur von Abstraktionen anderer Komponenten abhängen sollten und nicht für die Erstellung abhängiger Objekte verantwortlich sind. Stattdessen werden Objektinstanzen zur Laufzeit von einem IoC-Container über Dependency Injection (DI) bereitgestellt.

IoC ermöglicht ein besseres Softwaredesign, das die Wiederverwendung, die lose Kopplung und das einfache Testen von Softwarekomponenten erleichtert.

Abhängigkeitsinjektion (DI):

[~ # ~] di [~ # ~] ist eine Technik zum Übergeben von Abhängigkeiten an den Konstruktor eines Objekts. Wenn das Objekt aus dem Container geladen wurde, werden seine Abhängigkeiten automatisch vom Container bereitgestellt. Auf diese Weise können Sie eine Abhängigkeit konsumieren, ohne manuell eine Instanz erstellen zu müssen. Dies reduziert die Kopplung und gibt Ihnen eine bessere Kontrolle über die Lebensdauer von Objektinstanzen.

klicken um mehr zu sehen

7
Girish Kumar

In Spring Objects sind lose gekoppelt, d. H., Jede Klasse ist unabhängig voneinander, so dass alles einzeln getestet werden kann. Bei Verwendung dieser Klassen kann eine Klasse jedoch von anderen Klassen abhängig sein, die zuerst instanziiert werden müssen.

Also sagen wir spring, dass Klasse A von Klasse B abhängig ist. Wenn Sie also eine Bean (wie Klasse) für Klasse A erstellen, instanziieren Sie Klasse B vor der Klasse A und injizieren Sie diese in Klasse A mit Setter- oder Konstruktor-DI-Methoden. Das heißt, wir erzählen spring die Abhängigkeit zur Laufzeit. Das ist DI.

Da wir die Verantwortung für die Erstellung von Objekten (Beans) und die Verwaltung dieser Objekte und ihrer Aggregationen Spring übertragen, anstatt sie fest zu codieren, nennen wir sie Inversion Of Control (IOC).

7

Spring: Spring ist der Container "Inversion of Control" für die Java Platform.

Inversion of Control (IoC): Inversion of Control (IoC) ist eine objektorientierte Programmierpraxis, bei der die Objektkopplung zur Laufzeit durch ein "Assembler" -Objekt begrenzt wird und bei der statischen Analyse zur Kompilierungszeit in der Regel nicht erkennbar ist.

Abhängigkeitsinjektion (DI): "Die Abhängigkeitsinjektion ist ein Software-Entwurfsmuster, mit dem fest codierte Abhängigkeiten entfernt und geändert werden können, sowohl zur Laufzeit als auch zur Kompilierungszeit." -Wiki.

6
Nadhu

Umkehrung der Kontrolle - Dies bedeutet, die Kontrolle über das Erstellen und Instanziieren der Spring-Beans im Spring-Container IOC zu haben. Die einzige Arbeit, die der Entwickler erledigt, ist die Konfiguration der Beans in der Spring-XML-Datei.

Abhängigkeitsspritze-

Betrachten Sie eine Klasse Mitarbeiter

class Employee { 
   private int id;
   private String name;
   private Address address;

   Employee() {
     id = 10;
     name="name";
     address = new Address();
   }


}

und Klasse Adresse betrachten

class Address {
   private String street;
   private String city;

   Address() {
     street="test";
     city="test1";

  }
}

Im obigen Code werden die Adressklassenwerte nur festgelegt, wenn die Employee-Klasse instanziiert wird. Dies ist eine Abhängigkeit der Adressklasse von der Employee-Klasse. Und spring löst dieses Problem mithilfe des Konzepts der Abhängigkeitsinjektion, indem zwei Möglichkeiten zum Injizieren dieser Abhängigkeit bereitgestellt werden.

  1. Setterinjektion

Setter-Methode in der Employee-Klasse, die eine Referenz der Address-Klasse verwendet

public void setAddress(Address addr) {
    this.address = addr;
}
  1. Konstruktor-Einspritzung

Konstruktor in der Employee-Klasse, der Address akzeptiert

Employee(Address addr) {
      this.address = addr;
}

Auf diese Weise können die Adressklassenwerte unabhängig voneinander festgelegt werden, indem entweder Setter/Konstruktor-Injection verwendet wird.

4
Hetal Rachh

Inversion of Control ist ein generisches Konstruktionsprinzip der Software-Architektur, mit dessen Hilfe wiederverwendbare, modulare Software-Frameworks erstellt werden können, die einfach zu warten sind.

Hierbei handelt es sich um ein Konstruktionsprinzip, bei dem der Steuerungsfluss aus der generisch geschriebenen Bibliothek oder aus wiederverwendbarem Code "empfangen" wird.

Um dies besser zu verstehen, sehen wir uns an, wie wir in früheren Codierungstagen codiert haben. In prozeduralen/traditionellen Sprachen steuert die Geschäftslogik im Allgemeinen den Fluss der Anwendung und "ruft" den generischen oder wiederverwendbaren Code/die wiederverwendbaren Funktionen auf. In einer einfachen Konsolenanwendung wird mein Steuerungsfluss beispielsweise durch die Anweisungen meines Programms gesteuert, die möglicherweise Aufrufe einiger allgemeiner wiederverwendbarer Funktionen enthalten.

print ("Please enter your name:");
scan (&name);
print ("Please enter your DOB:");
scan (&dob);

//More print and scan statements
<Do Something Interesting>

//Call a Library function to find the age (common code)
print Age

Im Gegensatz dazu sind die Frameworks mit IoC der wiederverwendbare Code, der die Geschäftslogik "aufruft".

In einem Windows-basierten System steht beispielsweise bereits ein Framework zum Erstellen von UI-Elementen wie Schaltflächen, Menüs, Fenstern und Dialogfeldern zur Verfügung. Wenn ich die Geschäftslogik meiner Anwendung schreibe, werden Framework-Ereignisse meinen Geschäftslogikcode aufrufen (wenn ein Ereignis ausgelöst wird) und NICHT das Gegenteil.

Obwohl der Code des Frameworks meine Geschäftslogik nicht kennt, weiß er immer noch, wie er meinen Code aufruft. Dies wird durch Ereignisse/Delegierte, Rückrufe usw. erreicht. Hier ist die Flusskontrolle "invertiert".

Anstatt den Steuerungsfluss von statisch gebundenen Objekten zu beeinflussen, hängt der Fluss vom gesamten Objektgraphen und den Beziehungen zwischen verschiedenen Objekten ab.

Abhängigkeitsinjektion ist ein Entwurfsmuster, das das IoC-Prinzip zum Auflösen von Abhängigkeiten von Objekten implementiert.

In einfacheren Worten, wenn Sie versuchen, Code zu schreiben, werden Sie verschiedene Klassen erstellen und verwenden. Eine Klasse (Klasse A) kann andere Klassen (Klasse B und/oder D) verwenden. Klasse B und D sind also Abhängigkeiten von Klasse A.

Eine einfache Analogie wird ein Klassenauto sein. Ein Auto könnte von anderen Klassen wie Motor, Reifen und mehr abhängen.

Die Abhängigkeitsinjektion schlägt vor, dass anstelle der abhängigen Klassen (hier Class Car), die ihre Abhängigkeiten (Class Engine und Class Tire) erstellen, der Klasse die konkrete Instanz der Abhängigkeit injiziert wird.

Lassen Sie uns mit einem praktischeren Beispiel verstehen. Denken Sie daran, dass Sie Ihren eigenen TextEditor schreiben. Unter anderem können Sie über eine Rechtschreibprüfung verfügen, mit der der Benutzer die Tippfehler in seinem Text überprüfen kann. Eine einfache Implementierung eines solchen Codes kann sein:

Class TextEditor
{

    //Lot of rocket science to create the Editor goes here

    EnglishSpellChecker objSpellCheck;
    String text;

    public void TextEditor()

    {   

        objSpellCheck = new EnglishSpellChecker();

    }

    public ArrayList <typos> CheckSpellings()
    {

        //return Typos;

    }

}

Auf den ersten Blick sieht alles rosig aus. Der Benutzer schreibt einen Text. Der Entwickler erfasst den Text und ruft die CheckSpellings-Funktion auf und findet eine Liste der Tippfehler, die er dem Benutzer anzeigt.

Alles scheint gut zu funktionieren, bis eines schönen Tages ein Benutzer anfängt, im Editor Französisch zu schreiben.

Um die Unterstützung für mehr Sprachen bereitzustellen, benötigen wir mehr Rechtschreibprüfer. Wahrscheinlich französisch, deutsch, spanisch etc.

Hier haben wir einen eng gekoppelten Code mit "English" SpellChecker erstellt, der eng mit unserer TextEditor-Klasse gekoppelt ist, was bedeutet, dass unsere TextEditor-Klasse vom EnglishSpellChecker abhängig ist, oder mit anderen Worten, EnglishSpellCheker ist die Abhängigkeit für TextEditor. Wir müssen diese Abhängigkeit entfernen. Darüber hinaus benötigt unser Texteditor eine Möglichkeit, den konkreten Verweis einer Rechtschreibprüfung nach Ermessen des Entwicklers zur Laufzeit zu speichern.

Wie wir in der Einführung von DI gesehen haben, wird vorgeschlagen, der Klasse die Abhängigkeiten zu injizieren. Daher sollte es in der Verantwortung des aufrufenden Codes liegen, alle Abhängigkeiten in die aufgerufene Klasse/den aufgerufenen Code einzufügen. So können wir unseren Code so umstrukturieren

interface ISpellChecker
{

    Arraylist<typos> CheckSpelling(string Text);

}

Class EnglishSpellChecker : ISpellChecker

{

    public override Arraylist<typos> CheckSpelling(string Text)

    {

        //All Magic goes here.

    }

}



Class FrenchSpellChecker : ISpellChecker

{

    public override Arraylist<typos> CheckSpelling(string Text)

    {

        //All Magic goes here.

    }

}

In unserem Beispiel sollte die TextEditor-Klasse die konkrete Instanz des ISpellChecker-Typs erhalten.

Jetzt kann die Abhängigkeit in Constructor, eine Public Property oder eine Methode eingefügt werden.

Versuchen wir, unsere Klasse mit Constructor DI zu ändern. Die geänderte TextEditor-Klasse sieht ungefähr so ​​aus:

Class TextEditor

{

    ISpellChecker objSpellChecker;

    string Text;



    public void TextEditor(ISpellChecker objSC)

    {

        objSpellChecker = objSC;

    }



    public ArrayList <typos> CheckSpellings()

    {

        return objSpellChecker.CheckSpelling();

    }

}

Damit der aufrufende Code beim Erstellen des Texteditors den entsprechenden SpellChecker-Typ in die Instanz des TextEditors einfügen kann.

Sie können den vollständigen Artikel lesen hier

3
Amrit

Die herkömmliche Methode zum Abrufen der Adressinstanz in Employee besteht darin, eine neue Instanz der Adressklasse zu erstellen. Spring erstellt alle abhängigen Objekte für uns, sodass wir uns nicht um Objekte kümmern müssen.

Im Frühling sind wir also einfach auf den Federbehälter angewiesen, der uns das Abhängigkeitsobjekt liefert.

1
SumataPatil

IOC ist eine Technik, bei der Sie das Objekt von einer anderen Person erstellen lassen. Und die andere Person im Falle des Frühlings ist IOC container.

Abhängigkeitsinjektion ist eine Technik, bei der ein Objekt die Abhängigkeit eines anderen Objekts liefert.

0
daemon