[Java EE] @ Abhängiges häufiges Missverständnis

@Dependent

Eine der Scope-Annotationen von CDI. Der Lebenszyklus des Oszilloskops ist "Folgen Sie dem Umfang der zu injizierenden Bohne"

Missverständnis

Die obige Beschreibung. Wenn die zu injizierende Bean beispielsweise @RequestScoped ist, verhält sich die Bean von @Dependent auch wie @RequestScoped. Ich denke du kannst es bekommen.

In der Tat ist dies ein Fehler!

Illustration

Zum Beispiel gibt es den folgenden Code.

MainBean.java


@RequestScoped
public class MainBean {

    @Inject
    private HogeBean hogeBean;

    @Inject
    private FugaBean fugaBean;

    public void execute(){

        hogeBean.setMethod(); // 1

        fugaBean.method(); // 3

        hogeBean.printMethod(); // 6

    }
}

HogeBean.java


@RequestScoped
public class HogeBean {

    @Inject
    private DependentBean depBean;

    public void setMethod(){
        depBean.setId("ID in HogeBean festgelegt"); // 2
    }

    public void printMethod(){
        System.out.println(depBean.getId()); // 7
    }

}

FugaBean.java


@RequestScoped
public class FugaBean {

    @Inject
    private DependentBean depBean;

    public void method(){

        System.out.println(depBean.getId()); // 4
        depBean.setId("ID in FugaBean festgelegt"); // 5

    }
}

DependentBean.java


@Data
@Dependent
class DependentBean{

    private String id;

}

Angenommen, die MainBean-Ausführung wird von irgendwoher ausgeführt.

  1. Die setMethod () von hogeBean wird aufgerufen.

Es wird so sein.

Die abhängige Bean wird als Bean von @RequestScoped betrachtet, wenn sie so interpretiert wird, dass sie denselben Bereich wie der Bereich des Inject-Ziels hat. Das @ RequestScoped-Objekt verwendet dieselbe Instanz in einer Anforderung Der in 4 oben ausgegebene Wert sollte der in 2 eingestellte Wert sein, und der in 7 ausgegebene Wert sollte der in 5 eingestellte Wert sein.

Das Ausgabeergebnis ist also

Konsole


ID in HogeBean festgelegt
ID in FugaBean festgelegt

Sollte sein.

In der Realität ist das Ausgabeergebnis jedoch

Konsole


null
ID in HogeBean festgelegt

Es wird sein.

Die Überlebenszeit von @Dependent ist

Ist die richtige Antwort. Die depBean wird generiert, wenn die hogeBean generiert wird. Die depBean wird zerstört, wenn die hogeBean zerstört wird. Ebenfalls, Die depBean von hogeBean und die depBean von fugaBean sind separate Instanzen.

Um es grob auszudrücken, es ist das gleiche Bild wie das Erstellen einer neuen Instanz in einem Feld. (Natürlich ist die Behandlung in der Realität anders, weil es sich nicht um ein CDI-Management handelt.)

Zirkulärer Verweis

Grundsätzlich gibt es kein Problem mit Zirkelverweisen zwischen CDI-verwalteten Beans. Wenn Sie jedoch Zirkelverweise zwischen @ abhängigen Beans erstellen, tritt beim Starten des Servers ein Fehler auf. Dies liegt daran, dass die Bean, von der es abhängt, nicht gefunden werden kann.

Zusammenfassung

Wenn Sie sorgfältig darüber nachdenken, was passiert, wenn sich im Inject-Ziel @ApplicationScoped oder @SessionScoped befindet? Das stimmt, aber es gab viele Leute um mich herum, die falsch verstanden haben.

Wenn Sie die Komponenten nach Domänen unterteilen, können Sie für jede Komponente unterschiedliche Status haben, sodass Sie sie anscheinend gut verwenden können.

Recommended Posts

[Java EE] @ Abhängiges häufiges Missverständnis
[Java] Übersicht über Java
Abgelaufene Java-Sammlung
Voraussichtliche Funktionen von Java
NIO.2 Überprüfung von Java
Geschichte der Java-Annotationen
Java (Verdienste des Polymorphismus)
NIO Bewertung von Java
[Java] Drei Funktionen von Java
Zusammenfassung der Java-Unterstützung 2018
[Java] [Java EE] [Glassfish] (Fortsetzung) Stil, der den Cache von Glassfish bezweifelt
Über Java-Instanzen
[Java] Anfängerverständnis von Servlet-②
[Java] Praxis der Ausnahmebehandlung [Ausnahme]
[Java11] Stream-Zusammenfassung - Vorteile von Stream -
Grundlagen der Zeichenoperation (Java)
Aktivieren Sie Java EE mit NetBeans 9
[Java] Erstellen von Originalanmerkungen
Java-Lerntag 4
[Java] Anfängerverständnis von Servlet-①
Java Ende des Monats plusMonate
[Java] Zusammenfassung der regulären Ausdrücke
[Java] Zusammenfassung der Operatoren (Operator)
[Java] Implementierung des Faistel-Netzwerks
[Java] Komparator der Collection-Klasse
Zusammenfassung der Grundlagen der Java-Sprache
Zusammenfassung der Java Math Klasse
Aufzählung aller Kombinationen Java
Java (Vererbung von is-ein Prinzip)
Vor- und Nachteile von Java
Vorteile der statischen Java-Methode
[Java] Zusammenfassung der Steuerungssyntax
Java-Implementierung von Tri-Tree
Zusammenfassung der Java-Fehlerverarbeitung
[Java] Zusammenfassung der Entwurfsmuster
[Java] Zusammenfassung der mathematischen Operationen