[JAVA] Frühlingsgrundlagen ~ DI Edition ~

Über DI

Was ist DI?

Ermöglichen Sie der APP, die die Instanz direkt erstellt hat, die Instanz über den DI-Container abzurufen. Die Vorteile der Verwendung von DI sind wie folgt.

Die im DI-Container registrierte Komponente heißt "Bean". Die Konfiguration wird als "Bean-Definition" bezeichnet.

Implementierungsmethode mit DI

Konfigurationsmethode

Wird als Konfigurationsklasse mit @Configuration deklariert Bean Definition mit @Bean

AppConfig.java


@Configuration
public class AppConfig {
    @Bean
    TestRepository testRepo() {
        retrun new TestRepositoryImpl();
    }
}

--xml Basis

Bean-Definition im -Element. Das Attribut id definiert den Bean-Namen und das Attribut Class definiert ihn als Instanz der Bean dieser Klasse.

.xml


<beans>
<bean id="test" class="com.test.TestImpl" />
</beands>

--Notationsbasis

Eine Methode zum Scannen einer Klasse mit einer Anmerkung zur Bean-Definition und zum Registrieren im DI-Container (Komponentenscan). Die intuitivste Implementierung.

Bean Definition Seite

TestImpl.java


@Component
publi classTestImpl implements Test {
}

Benutzerseite Fügen Sie dem Konstruktor @Autowired für die automatische Injektion hinzu.

TestImpl.java


@Component
publi class TestUseImpl implements TestUse {
    @AutoWired
    public TestUseImpl(Test test) {
    }
}

Arten der Injektion

Es gibt drei Methoden, aber die Konstruktorinjektion scheint gut zu sein. Ausgelassen. Eine konstellare Injektion scheint empfohlen zu werden, da die DI-Instanz endgültig wird. https://irof.hateblo.jp/entry/2017/04/16/222737

Informationen zur automatischen Verkabelung

Auto-Wiring ist ein Mechanismus, der automatisch in einen DI-Container injiziert wird, ohne explizit eine Bean mit @Bean zu definieren. Wird intern nach Typ oder Name aufgelöst. Wenn jedoch mehrere DI-Container mit demselben Typ definiert sind, tritt ein Fehler auf, da der DI-Container keine Rolle spielt, welcher verwendet wird. In solchen Fällen werden @Qualifier und @Resouce verwendet.

Qualifier und Ressource

Angenommen, Sie registrieren eine Methode, die dieselbe Convert-Klasse in der Bean zurückgibt, wie unten gezeigt.

AppConfig


@Configuration
@ComponentScan
public class AppConfig {
    @Bean
    Convert getA() {
        return new ConvertA();
    }
    @Bean
    Convert getB() {
        return new ConvertB();
    }

Bei dem Versuch, wie folgt zu injizieren, kann die pg-Seite nicht bestimmen, ob "getA" oder "getB" injiziert werden soll.

MainService


@Service
public class MainService {
    @Autowired
    private Convert getA;

    public String execute() {
        return getA.getConvert();
    }

Es ist möglich zu trennen, indem explizit angegeben wird, welches mit der folgenden Beschreibung injiziert werden soll.

@Qualifier("getA")
@Autowired
private Convert getA;
// @Resouce durchsucht den Container nach der Zielinstanz nach dem Eigenschaftsnamen
//Wenn der Name mit dem Namen der Zieleigenschaft übereinstimmt, kann er weggelassen werden.
@Resouce(name = "getA")Oder@Resouce
@Autowired
private Convert getA;

Schlechtes Beispiel


@Service
public class MainService {
    private final Convert getA;
    
    @Resouce(name = "getA")
    public MainService (Convert a) {
        getA = a;
    }

    public String execute() {
        return getA.getConvert();
    }

Recommended Posts

Frühlingsgrundlagen ~ DI Edition ~
[Java] Spring DI ③
Über DI des Frühlings ①
Erster Frühlingsstiefel (DI)
Über DI des Frühlings ②
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
Einführung in Spring Boot ~ ~ DI ~
[Java] Wie Spring DI funktioniert
Informationen zu Anmerkungen zu Spring DI
[Java] Spring DI ④ - Lebenszyklusverwaltung
Anmerkungen zur Spring Framework-Studie [Teil 1] DI-Container
DI SessionScope Bean im Spring Boot 2-Filter