@Dependent
Eine der Scope-Annotationen von CDI. Der Lebenszyklus des Oszilloskops ist "Folgen Sie dem Umfang der zu injizierenden Bohne"
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!
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.
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.)
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.
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