Spring Dependency Injection mit Java, Kotlin

Überblick

Dieses Mal werde ich zusammenfassen, wie Spring DI mit Java bzw. Kotlin geschrieben wird. Die Umgebung ist Java 1.8, Kotlin 1.2.31, Spring Boot 2.0.0.RELEASE, Spring 5.0.3.RELEASE.

Über DI im Frühjahr

Ich werde die ausführliche Erklärung zu DI weglassen. Wenn Sie mehr wissen möchten, gehen Sie zu Spring Official Reference. Lesen Sie bitte.

Im Frühjahr gibt es zwei Haupttypen von DI: "** Setter-Einspritzung " und " Konstruktor-Einspritzung **". Wenn Sie online suchen, finden Sie das Wort "Feldinjektion", aber es ist ein Begriff, der nicht in der offiziellen Referenz erscheint. Zur Erläuterung wird in diesem Artikel auch der Begriff Feldinjektion verwendet, der jedoch im Wesentlichen mit der Setter-Injektion identisch ist. Das Spring-Team empfiehlt außerdem die Konstruktorinjektion, da dadurch sichergestellt werden kann, dass das abhängige Objekt nicht null oder unveränderlich ist. Andererseits sollte die Setter-Injektion für begrenzte Zwecke verwendet werden, z. B. zum Zurücksetzen von Abhängigkeiten.

Im Folgenden wird zusammengefasst, wie diese "Feldinjektion", "Setterinjektion" und "Konstruktorinjektion" in Java und Kotlin geschrieben werden.

Field Injection Lassen Sie uns zunächst über Field Injection in Java sprechen. Die Feldinjektion wird durch Schreiben wie ↓ ausgedrückt.

@Component
class SampleComponent{

  @Autowired
  public HogeService hogeService;

  @Autowired
  public FugaService fugaService;

  public void hogehoge(){
    hogeService.hoge();
  }

  public void fugafuga(){
    fugaService.fuga();
  }
}

Als nächstes schreiben Sie in Kotlin als ↓.

@Component
class SampleComponent{
  @Autowired
  lateinit var hogeService: HogeService
  
  @Autowired
  lateinit var fugaService: FugaService

  /*Die folgenden Methoden werden weggelassen*/
}

Kotlin-Feldvariablen müssen zum Zeitpunkt der Deklaration initialisiert werden. Wenn Sie also DI angeben, müssen Sie explizit angeben, dass es sich um eine verzögerte Initialisierung mit dem Modifikator lateinit handelt. Außerdem wird in Field Injection der Wert später zugewiesen, sodass eine Variablendeklaration mit val nicht möglich ist.

Setter Injection Wenn Sie als nächstes die Setter-Injection in Java schreiben, ist dies Code wie ↓.

@Component
class SampleComponent{
 
  private HogeService hogeService;
  
  private FugaService fugaService;

  @Autowired
  public void setHoge(HogeService hogeService){
    this.hogeService = hogeService;
  }

  @Autowired
  public void setFuga(FugaService fugaService){
    this.fugaService = fugaService;
  }

  /*Die folgenden Methoden werden weggelassen*/
}

Wenn Sie eine Setter-Injektion in Kotlin schreiben, erhalten Sie ebenfalls Code wie ↓.

@Component
class SampleComponent{

  private var hogeService: HogeService? = null
    @Autowired
    set(hogeService){
      this.hogeService = hogeService
    }

  private var fugaService: FugaService? = null
    @Autowired
    set(fugaService){
      this.fugaService = fugaService
    }

  /*Die folgenden Methoden werden weggelassen*/

/*Sie können auch wie ↓ schreiben
  private lateinit var hogeService: HogeService
  
  private lateinit var fugaService: FugaService
  
  @Autowired
  fun setHogeService(hogeService: HogeService){
    this.hogeService = hogeService
  }

  @Autowired
  fun setFugaService(fugaService: FugaService){
    this.fugaService = fugaService
  }
*/
}

In kotlin wird automatisch ein Getter generiert, wenn ein Feld mit val deklariert wird, und ein Getter und ein Setter werden automatisch generiert, wenn ein Feld mit var deklariert wird. Daher wird die Variable wie die Feldinjektion mit var deklariert. Da außerdem die Verarbeitung des Setters angepasst werden muss, muss set () wie im obigen Code gezeigt geschrieben werden. Sie können es auch ähnlich wie Java schreiben, wie ich es in den Kommentaren geschrieben habe.

Constructor Injection Wenn Sie schließlich Constructor Injection in Java schreiben, sieht der Code wie folgt aus: ↓.

@Component 
class SampleComponent{

  private final HogeService hogeService;

  private final FugaService fugaService;

  @Autowired
  SampleComponent(HogeService hogeService, FugaService fugaService){
    this.hogeService = hogeService;
    this.fugaService = fugaService;
  }

  /*Die folgenden Methoden werden weggelassen*/
}

Wenn Sie nur einen Konstruktor haben, können Sie @Autowired weglassen.

@Component 
class SampleComponent{

  private final HogeService hogeService;

  private final FugaService fugaService;

  //Wenn es nur einen Konstruktor gibt@Autowired kann weggelassen werden
  SampleComponent(HogeService hogeService, FugaService fugaService){
    this.hogeService = hogeService;
    this.fugaService = fugaService;
  }
  /*Die folgenden Methoden werden weggelassen*/
}

Wenn Sie Lombok verwenden, um automatisch einen Konstruktor zu generieren, können Sie außerdem die Konstruktorinjektion ausdrücken, ohne den Konstruktor zu deklarieren.

@Component 
@AllArgsConstructor
class SampleComponent{

  private final HogeService hogeService;

  private final FugaService fugaService;

  //Es wird automatisch von Lombok generiert, sodass Sie keinen Konstruktor schreiben müssen.

  /*Die folgenden Methoden werden weggelassen*/
}

Wenn Sie als nächstes die Konstruktorinjektion in Kotlin ausdrücken, ist dies der Code von ↓.

@Component
class SampleComponent(
  private val hogeService: HogeService,
  private val fugaService: FugaService
){
  /*Die folgenden Methoden werden weggelassen*/
}

In Kotlin gibt es eine Syntax namens Primärkonstruktor, und durch Schreiben als ↑ wird der Konstruktor zur Kompilierungszeit automatisch generiert. Auf diese Weise können Sie die Konstruktorinjektion ohne Lombok-Anmerkungen darstellen.

Referenz

Recommended Posts

Spring Dependency Injection mit Java, Kotlin
[Java] [Spring] Spring Boot Das mysteriöse Hamarineta der Abhängigkeitsinjektion
Verwenden von Mapper mit Java (Spring)
Über Kotlin
Über den Frühling ③
Frühling Java
[Frühling] Verschleiern Sie bestimmte Felder mit Anmerkungen [Java]
Eine Geschichte über ein in Java geschriebenes Spring Boot-Projekt, das Kotlin unterstützt
Über die Java-Schnittstelle
[Java] Informationen zu Java 12-Funktionen
[Java] Über Arrays
Über Spring AOP
Etwas über Java
Wo ist mit Java?
Informationen zu Java-Funktionen
Über den Frühling AOP
Über Java-Threads
[Java] -Schnittstelle
Über die Java-Klasse
Informationen zu Java-Arrays
Über Java-Vererbung
Über Schnittstelle, Java-Schnittstelle
[Java] Spring DI ③
Über Java Var
Über Java Literal
Informationen zu Java-Befehlen
So stellen Sie Spring Boot Dependency Injection (DI) ein
[Java] So lassen Sie die Federkonstruktorinjektion mit Lombok weg
Informationen zur Java-Protokollausgabe
Informationen zur Java-Funktionsschnittstelle
Sortieren mit Java-Komparator
Java, über zweidimensionales Array
Über die Klassenteilung (Java)
Informationen zur Spring Security-Authentifizierung
Über [Java] [StreamAPI] allMatch ()
Informationen zur Java StringBuilder-Klasse
[Java] Über Singleton Class
Informationen zur Bindung von Java-Methoden
Über DI des Frühlings ①
[Java] Über anonyme Klassen
Informationen zu Aufteilungsmethoden (Java)
Über Spring AOP Pointcut
Schrottpraxis mit Java ②
[Java Silver] Informationen zur Initialisierung
Über DI des Frühlings ②
Informationen zur Java-Array-Liste
Über Java-Polymorphismus super ()
[Java, Kotlin] Typabweichung
Informationen zur Vererbung (Java Silver)
Informationen zur Java String-Klasse
Informationen zu Java-Zugriffsmodifikatoren
Schrottpraxis mit Java ①
Über Java-Lambda-Ausdrücke
Informationen zu Java-Einstiegspunkten
Java 10 Docker-Unterstützung
Persönliche Zusammenfassung über Java
Dolch2 - Android-Abhängigkeitsinjektion