2016-09-06 5 views
0

Ich bin ein wenig neugierig auf Projekt-Setup.CDI injizieren konkrete Abhängigkeiten zwischen Gläsern

Ich habe ein Projekt, das ich versuche zu aktualisieren.

Also habe ich einige meiner konkreten Klassen mit der @ Named ("") Annotation gepfeffert. Die Klasse erweitert tatsächlich eine abstrakte Klasse, die eine Schnittstelle implementiert. Ich möchte die benannte Klasse in eine Klasse injizieren, die nicht in diesem Jar enthalten ist. Was sind die Überlegungen, die ich dabei beachten muss?

Antwort

1

Ihre Frage ist sehr vage, also erwarten Sie nicht, dass diese Antwort Sie mit Details betäubt.

Die Klasse erweitert eigentlich eine abstrakte Klasse, die eine Schnittstelle implementiert.

Dies sollte kein Problem sein - die endgültige Bean-Instanz wird den Typ aller Klassen und Schnittstellen in der Hierarchie haben. Nichts, über das man sich sorgen sollte.

Ich möchte die benannte Klasse in eine Klasse injizieren, die nicht in diesem Jar enthalten ist.

Erstens können Sie nur Bohnen in andere Bohnen injizieren. Das bedeutet, dass Ihre andere Klasse (die nicht im selben Jar ist) eine Bohne werden muss. Dazu aktivieren Sie das CDI im anderen Archiv und kommentieren die Klasse mit dem gewünschten Umfang.

Zweitens, das andere Glas, muss eine Abhängigkeit von dem mit @Named Bohnen haben, so dass der CDI-Container diese Bohnen sehen kann.

Zu guter Letzt sollten Sie sicherstellen, dass Sie die entsprechenden Bereiche für die Beans verwenden. Der Bereich gehört zu einem bestimmten Kontext und jeder hat einen anderen Lebenszyklus. So zum Beispiel @ApplicationScoped Bohnen leben von App Start-up bis zum Herunterfahren, während @RequestScoped sind nur während einer HTTP-Anfrage aktiv.

+0

Danke für Ihre Eingabe. Und du hast recht, es war eine vage Frage. Ich bin neu in CDI und es ist Fähigkeiten. Wenn Sie die Klasse mit dem gewünschten Bereich annotieren, habe ich sie mit der Annotation "Name()" versehen. Wie funktioniert der Scope im CDI-Container? Sie erwähnen AplicationScope live von (angenommen) jvm startup-shutdown und RequestedScoped lebt per HTTP-Anfrage. Muss ich beide Bohnen kommentieren? – SoftwareSavant

+0

Sie sollten sich vielleicht [http://weld.cdi-spec.org/documentation/](documentation) ansehen. Wie für Ihre Fragen - '@ Named' gibt der Bean keinen Bereich, ihr Ziel ist es, sie zu machen [http://docs.jboss.org/weld/reference/latest/en-US/html_single/#_el_name] (zugänglich von EL). Bean mit nur '@ Named' Annotation wird standardmäßig' @ Dependent' haben. Auf der nächsten Notiz - '@ ApplicationScoped' lebt von ** CDI-Container-Start ** (der Punkt, wenn CDI startet und die Magie beginnt zu seinem Herunterfahren). Und Sie müssen Beans nicht mit Anmerkungen versehen, wenn '@ Dependent' gut genug für Sie ist (rate nicht). – Siliarus

+0

Wie funktioniert Scopes in CDI-Container - jeder hat einen anderen Lebenszyklus, nach dem es nicht mehr existiert und die mit ihm verbundenen Beans zerstört werden. Wie nach der Anfrage für '@ RequestScoped' Beans. Sobald eine neue Anfrage erscheint, erhalten Sie eine neue Bean. Sie sollten in der Lage sein zu erraten, wie '@ SessionScoped' funktioniert. '@ ConversationScoped' und' @ Dependent' könnten schwieriger sein und ich (wiederum) schlage Weld-Dokumente vor. Sie können auch eigene Bereiche definieren. – Siliarus

Verwandte Themen