Kann ein CDI-Scope zerstört werden?

8

Ich arbeite an einer Java EE-Anwendung, hauptsächlich JAX-RS mit einer JSF-Verwaltungskonsole, die CDI / Weld für die Abhängigkeitsinjektion mit javax.enterprise.context.ApplicationScoped Objekte. Kleinere Debugging-Probleme beiseite, CDI hat wunderbar für dieses Projekt gearbeitet.

Jetzt brauche ich eine sehr grobkörnige Kontrolle über CDI-injected Objektlebenszyklen. Ich brauche die Fähigkeit zu:

  • Entfernen Sie ein injiziertes Objekt aus dem Anwendungskontext oder
  • Löschen / Löschen / Zurücksetzen / Löschen des gesamten Anwendungskontextes oder
  • Definieren Sie mein eigenes @ScopeType und implementieren Sie Context in denen ich Methoden zur Verfügung stellen könnte, um eine der beiden oben genannten Aufgaben durchzuführen.

Ich bin mir vollkommen bewusst, dass dies im Allgemeinen, wenn nicht sogar gegensätzlich zu CDI und Abhängigkeitsinjektionen geschieht. Ich will nur wissen

  • Ist das aus der Ferne möglich?
  • Wenn ja, was ist der einfachste / einfachste / schnellste / idiotensicherste Weg, um den Job zu erledigen?
Matt Ball 23.06.2011, 19:16
quelle

4 Antworten

4

Ein benutzerdefinierter Bereich, der Ihren Anforderungen entspricht, finden Sie unter Ссылка Vielleicht müssen Sie die Implementierung etwas anpassen.

    
Dar Whi 30.08.2011 02:17
quelle
3

Schweißnaht-Referenzdokumentation Abschnitt 2.1.2

  

Beachten Sie, dass sobald eine Bohne gebunden ist   In einem Kontext bleibt es dabei   Kontext, bis der Kontext ist   zerstört. Es gibt keine Möglichkeit, manuell   entferne eine Bean aus einem Kontext. Wenn du   will nicht, dass die Bohne in der sitzt   Sitzung auf unbestimmte Zeit, in Betracht ziehen mit   ein anderer Bereich mit einer kurzen Lebensdauer,   wie die Anfrage oder Konversation   Umfang.

Beispiel für ein benutzerdefiniertes Oszilloskop Porting the veiwscoped jsf annonation nach cdi

Wenn Sie wirklich nicht den Pfad des benutzerdefinierten Bereichstyps verwenden möchten. Sie können eine nicht portierbare -Methode verwenden, indem Sie AbstractSharedContext , um Zugriff auf den BeanStore oder die cleanUp () - Methode des Kontexts zu erhalten.

In diesem Thread erfahren Sie, wie Sie eine BeanManager Instanz für Ihre Umgebung erhalten

    
Joel Hudon 03.07.2011 22:48
quelle
1

Standardmäßig gibt es nur den Conversation-Bereich, über den Sie den gesamten Lebenszyklus kontrollieren können. Sie können jedoch Ihren eigenen Bereich erstellen, wenn die Konversation nicht Ihren Anforderungen entspricht. Das Erstellen eines Bereichs ist eine schwierige Aufgabe, aber Sie können zum Schweißcode gehen und nachschauen, wie die Konversation implementiert wurde.

    
Antoine Sabot-Durand 30.06.2011 20:35
quelle
0

In CDI 1.1 gibt es eine javax.enterprise.context.spi.AlterableContext -Schnittstelle, mit der Sie eine Bean-Instanz einzeln zerstören können. Alle normalen Bereiche (Anfrage, Konversation, Sitzung) sind änderbar.

%Vor%

Das beanManager ist hier eine javax.enterprise.inject.spi.BeanManager Instanz. Sie können es über JNDI Lookup erhalten:

%Vor%

oder über statische CDI-Methode:

%Vor%

, aber beachten Sie die Probleme mit der statischen Methode in einigen Weld-Versionen:

Vsevolod Golovanov 16.06.2014 11:45
quelle

Tags und Links