Auflösung von externen (Drittanbietern) Bohnen in Schweißnaht
-
20-09-2019 - |
Frage
Ich weiß, dass es noch nicht ganz beliebt ist, da die Spezifikation vor wenigen Monaten veröffentlicht wurde.
Ich habe noch nicht "installiert", ich lese nur und auf diese Frage möchte ich sicherstellen, dass ich diesen wichtigen Punkt richtig verstanden habe:
Ist die Auflösung von Bohnen, die in Gläser mit dritten Parteien sind, die sie als deklarieren <alternatives>
in deiner beans.xml
?
Wenn nicht, wie man Bohnen von Bibliotheken von Drittanbietern verwendet, die nicht haben beans.xml
?
Wenn Sie das Glas auf den Klassenpfad legen beans.xml
in ihren META-INF
, was Sie für Drittanbietergläser nicht wahr machen können. (sehen Gavin Kings Posten zu diesem Thema)
Lösung
Warum so kompliziert denken?
Machen Sie einfach ein Producterthod für diese Drittanbieterklassen.
Angenommen
private @Inject PdfFaxService faxService;
In Ihrem Code können Sie dies einfach mit einer Produzentenmethode zur Verfügung stellen. Der pdffaxService funktioniert staatenlos, sodass wir sicher davon ausgehen können, dass wir es schaffen können @ApplicationScoped
:
public @Produces @ApplicationScoped PdfFaxService createFaxService() {
return new PdfFaxService(initparameters);
}
irgendwo.
HTH.
Andere Tipps
Mein Verständnis von einem Alternative Ist es eine Alternative zu einer anderen Implementierung einer Schnittstelle, die Sie in einer anderen Bereitstellungsumgebung verwenden können (z. B. eine Testumgebung). Ein Alternative Bean wird erklärt, indem es mit Annotation mit Annotation mit @Alternative
.
Um eine Alternative in einem bestimmten Bereitstellungsszenario zu verwenden, wählen Sie sie in der aus <alternatives>
Element Ihres CDI -Bereitstellungsdeskriptors META-INF/beans.xml
. Dies wird ermöglichen @Alternative
Bohnen, die standardmäßig deaktiviert sind.
Wenn der Behälter für einen bestimmten Injektionspunkt eine mehrdeutige Abhängigkeit findet, wird die injizierte Alternativen untersucht und, wenn es genau einen gibt, diese Alternative aufnehmen.
Mit anderen Worten, Alternativen sind eine schöne Möglichkeit, eine zu ersetzen Bestehende Implementierung mit einem anderen zur Bereitstellungszeit. Wenn nichts ersetzt zu werden gibt, brauchen Sie keine Alternativen. Setzen Sie einfach Ihr Glas auf den Klassenpfad. Ich bin mir jedoch nicht sicher, ob dies genau Ihre Frage war, ich habe Zweifel an dem Konzept der Drittanbieter.
Mehr in 2.1.4. Alternativen, 4.6. Alternativen und 4.7. Unzufriedene und mehrdeutige Abhängigkeiten beheben (Aber ich denke, das ist das, was Sie lesen).
Aktualisieren: Um Ihre zusätzliche Frage zu beantworten.
Wenn nicht, wie man Bohnen von Drittanbieterbibliotheken verwendet, die keine Beans.xml haben
Dies kann nicht passieren, ein Bohnenarchiv muss eine haben bean.xml
(sei es leer), wie im Abschnitt beschrieben 15.6. Verpackung und Bereitstellung der Dokumentation:
CDI definiert kein spezielles Bereitstellungsarchiv. Sie können Bohnen in Gläser, EJB-Jars oder Kriege verpacken-jeder Einsatzort im Anwendungsklassenpfad. Allerdings das Archiv mussSei ein "Bohnenarchiv". Das bedeutet, dass jedes Archiv, das Bohnen enthält
beans.xml
in demMETA-INF
Verzeichnis des Klassenpfads oderWEB-INF
Verzeichnis der Web Root (für Kriegsarchive). Die Datei kann leer sein. Bohnen, die in Archiven eingesetzt werden, die keine habenbeans.xml
Die Datei steht nicht zur Verwendung in der Anwendung zur Verfügung.
Um eine unbefriedigte und mehrdeutige Abhängigkeit zu beheben, lesen Sie den zuvor erwähnten Abschnitt 4.7.
Update 2: Es scheint, dass die Verwendung BeforeBeanDiscovery.addAnnotatedType()
Es ist möglich, andere Klassen hinzuzufügen, die während der Bean -Entdeckung berücksichtigt werden sollen. (BeforeBeanDiscovery
ist eine Veranstaltung)