Bedeutung des Bean-Discovery-Modus, kommentiert in CDI 1.1
Bin ich die Migration einer Anwendung auf Java EE 7 und würde gerne die CDI-1.1. Aber ich bekomme nicht die Bedeutung von bean-discovery-mode="annotated"
. Die
Die CDI-1.1-Spezifikation ist nicht sehr hilfreich. Zumindest habe ich keine gefunden nützlich Absatz. Habe ich da was übersehen?
Diesem Beispiel läuft perfekt mit bean-discovery-mode="all"
und injiziert eine Instanz von LoggingClass
:
public class LoggingClass {
public Logger logger = Logger.getLogger("ALOGGER");
}
@Test
public class MMLoggerProducerIT extends Arquillian {
@Inject private LoggingClass lc;
}
Aber wenn ich von bean-discovery-mode="all"
zu bean-discovery-mode="annotated"
der container ist nicht in der Lage zu injizieren, eine Instanz in das Feld lc
.
Wie muss ich kommentieren LoggingClass
zu verwenden bean-discovery-mode="annotated"
richtig?
InformationsquelleAutor der Frage Oliver | 2013-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als eine praktische Sache,
bean-discovery-mode="ALL"
schaltet das Scannen aller Klassen in ein Archiv. Dies nennt man eine "explizite Archiv".Weglassen
beans.xml
oder Einstellungbean-discovery-mode="ANNOTATED"
macht das Archiv eine implizite Archiv. In diesem Fall wird der container zu Scannen Bohnen mit kommentierten scope-Typen.Dies erklärt, warum
LoggingClass
ist nicht eingespritzt, wenn Siebean-discovery-mode="ANNOTATED"
. Dokumentiert, wie in der Java EE 7 Tutorial:Edit: also nur um absolut klar ist, müssen Sie einen Rahmen geben, um
LoggingClass
. So etwas wie dieses:In Java EE 7 und CDI 1.1, wir die Forderung entfernt, gehören die
beans.xml
deployment-descriptor zu schalten CDI für ein Archiv, womit sich die CDI-1.1 im Einklang mit den meisten anderen Java-EE-APIs, wo deployment-Deskriptoren sind optional. Es auch entfernt die binäre on/off Natur einschließlichbeans.xml
oder nicht. Sie können Steuern, welche Dateien gescannt werden, indem die container mit den Einstellungen inbean-discovery-mode
.Finden Sie in der Java ee tutorial auf der Verpackung CDI-Anwendungen hier:
http://docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm#CACDCFDE
InformationsquelleAutor der Antwort Ian Evans
Bei der Verwendung
bean-discovery-mode="annotated"
nur Klassen mit einem bean Definition Anmerkung entdeckt. Alle anderen Klassen werden ignoriert. Jedem Rahmen-Typ eine bean Definition Annotations. Wenn ein Bereich Typ deklariert ist, auf eine bean-Klasse die bean-Klasse ist eine bean Definition Anmerkung [spec]. Die 1.1 spec ist nicht ganz klar hier. Nur Klassen mit einem@NormalScope
Umfang oder@Dependent
pseudo-scope entdeckt,@javax.inject.Singleton
und alle anderen@Scope
(pseudo -) Bereiche werden ignoriert.Beachten Sie, dass die definition eines "bean-Definition Anmerkung" geändert in CDI 1.2 und ist nun sehr gut definiert:
InformationsquelleAutor der Antwort rmuller
Bin ich auch einverstanden mit der Antwort der form @rmuller. Aber ich möchte darauf hinweisen, dass es noch anderes Verhalten, die auf einem Anwendungsserver Payara und Wildfly.
Siehe dazu das folgende Beispiel mit einem normalen, nicht den Gültigkeitsbereich der Klasse, aber mit eine @EJB-Injektion:
Wenn Sie eine beans.xml Datei:
Payara 4.1 wird die Behandlung der Klasse SomeClass NICHT als CDI-bean und wird NICHT injiziert der service EJB.
Das ist mir klar, dass es sich so verhält, wie angegeben in der Spezifikation.
Aber Wildfly 10 behandelt die Klasse als CDI-bean injiziert service EJB-das ist nicht zu erwarten. Um diese arbeiten die beans.xml die Datei sollte wie folgt Aussehen:
Ist es erstaunlich, dass die beiden am meisten verbreiteten application-Servern sind hier anders Verhalten.
InformationsquelleAutor der Antwort Ralph