[JAVA] Verstehe DI

Was ist DI?

Abhängigkeitsspritze. Anstatt eine Instanz der abhängigen Klasse innerhalb der abhängigen Klasse zu erstellen Haben Sie die abhängige Klasse als Feldvariable der abhängigen Klasse. Übergeben Sie daher die abhängige Klasse von außen im Konstruktor usw. Gewöhne dich daran, anstatt es zu lernen.

DI-Prozess

Es gibt viele Anmerkungen zu DI, aber es ist leicht zu verstehen, wenn Sie der Meinung sind, dass sie grundsätzlich in eine der folgenden drei Stufen eingeteilt sind. Was sind die drei Stufen von DI?

--Definieren der Klasse, die im DI-Container registriert werden soll

Ist.

Definition der Klasse, die im DI-Container registriert werden soll

Java-Definition

Wird als JavaConfig bezeichnet. --Erstellen Sie eine Klasse mit der Annotation @Configuration --Erstellen Sie eine Methode mit @ Bean-Annotation

@Configuration
public class AppConfiguration {

  //Registrieren Sie die ServiceImpl-Klasse im DI-Container
  @Bean 
  public Service service() {
    return new ServiceImpl();
  }

  //Registrieren Sie die RepositoryImpl-Klasse im DI-Container
  @Bean 
  public Repository repository()  {
    return new RepositoryImpl();
  }
  //Gleiches gilt weiter unten
  .
  .
  .
}

Ist es normal, eine Schnittstelle zu definieren und die Implementierungsklasse in @Configuration zu setzen?

Definition durch Annotation

//@Komponentenanmerkung@In der Serviceanmerkung enthalten
@Service 
public class ServiceImpl implements Service {
}

Registrierung im DI-Container

** Eigentlich ** registriere die Instanz im DI-Container. Durch Ausführen eines ** Komponentenscans ** wird die Registrierung der Instanz in DI realisiert.

Komponentenscan mit JavaConfig

@Configuration
@ComponentScan(basePackages = "jp.co.yahoo")
// @ComponentScan <-Wenn es kleiner als das aktuelle Verzeichnis ist
public class AppConfiguration {
}

Injektion aus DI-Behälter

Fügen Sie die Annotation @Autowired hinzu. Es gibt die folgenden drei Methoden.

Konstruktorinjektion

Fügen Sie dem Konstruktor @Autowired hinzu.

Es gibt einen Verdienst. Empfohlene Methode.

private final Service service; 
public Controller(Service service) {
  this.service = service; 
}

Feldinjektion

@Autowired
private Service service;

Setter-Injektion

private Service service;
@Autowired
public void setService(Service service) {
  this.service = service; 
}

Nur Gott @SpringBootApplication

Die Annotation @SpringBootApplication kann beim Starten der Anwendung hinzugefügt werden. Damit werden viele der oben genannten Anmerkungen ohne Erlaubnis erstellt. Wir werden uns den Prozess unten ansehen.

Referenz

Many Spring Boot developers always have their main class annotated with @Configuration, @EnableAutoConfiguration and @ComponentScan. Since these annotations are so frequently used together (especially if you follow the best practices above), Spring Boot provides a convenient @SpringBootApplication alternative.

The @SpringBootApplication annotation is equivalent to using @Configuration, @EnableAutoConfiguration and @ComponentScan with their default attributes:

package com.example.myproject;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

Vorbereitung 1: Informationen zur automatischen Konfiguration

** SpringBoot verfügt über eine vordefinierte JavaConfig-Klasse. ** ** ** Wenn Sie darüber nachdenken, ist dies natürlich. Es kann nicht als Framework bezeichnet werden, wenn bei jedem Hinzufügen einer externen Bibliothek eine DI-Zielklasse definiert und die Registrierung im DI-Container wiederholt werden muss.

Die Funktion zum automatischen Registrieren der in dieser Klasse definierten Instanz im DI-Container heißt ** AutoConfiguration **.

Von AutoConfiguration im DI-Container registrierte Bedingungen

--Auto-Konfiguration aktiviert --Die abhängige Bibliothek ist in pom.xml angegeben

** Die automatische Konfiguration kann aktiviert werden, indem eine Klasse mit der Annotation @EnableAutoConfiguration erstellt wird. ** ** ** Fügen Sie im Allgemeinen die Annotation @EnableAutoConfiguration zu einer Klasse hinzu, die die Annotation @Configuration enthält.

Vorbereitung 2: Starten Sie Spring Boot

Es gibt zwei Punkte beim Erstellen einer Anwendungsstartklasse.

-Add @SpringBootApplication Annotation

@SpringBootAnnotation enthält die folgenden Anmerkungen.

Sie können auch angeben, welche Pakete gescannt werden sollen, indem Sie das Attribut scanBasePackages verwenden.

@SpringBootApplication(scanBasePackages = "com.example")

Fazit

Durch Hinzufügen der Annotation @SpringBootApplication kann die standardmäßige JavaConfig-Definition und -Registrierung im DI-Container weggelassen werden.

Wenn Sie sich selbst registrieren (wenn Sie den Unterschied zur Standard-JavaConfig hinzufügen) und nur durch Annotation definieren, können Sie sich im DI-Container registrieren, indem Sie einfach die Annotation @Component hinzufügen, und Sie können die Annotation @Autowired einfügen. ..

Ergänzung

――Wenn der Unterschied zu groß ist, müssen Sie JavaConfig selbst definieren, aber derzeit wird es nur durch Anmerkungen definiert.

(Nun, ich denke, Sie müssen sich dessen nicht sehr bewusst sein, da die Ausführungsklasse auf der obersten Ebene platziert ist.)

Recommended Posts

Verstehe DI
Docker verstehen
Lassen Sie uns die Schließung verstehen!
Verstehen Sie den Java-Konstruktor
[Java] Spring DI ③