In CDI, ich bin in der Lage, eine Bean mit einem bestimmten Bereich zu injizieren, der Bereich, mit dem die Bean-Klasse definiert wurde. Aber was, wenn ich die Bean-Klasse ohne irgendeinen Umfang erstelle und dieser Bohne zum Zeitpunkt der Injektion Spielraum gebe. Meine Anforderung besteht darin, im letzteren Fall ein Injektionszeit-Scoping zu ermöglichen. Problem ist, dass die Injektion mit dependent scope
anstelle des gewünschten kommentierten Bereichs geschieht, es sei denn, ich verwende einen producer
.In CDI, wie man einer Bohne am Punkt der Einspritzung Spielraum gibt?
Beispiel:
CASE 1:
Als ich Umfang einer Bohne in ihrer Klassendeklaration wie folgt erklären:
@ApplicationScoped
class UserDetails {
...
}
Und injiziert wie folgt aus:
@ViewScoped
class UserView {
@Inject
UserDetails userDetails;
.
.
}
Es funktioniert wie erwartet. Die in den Anwendungsbereich der Anwendung injizierte Bean ist in allen anderen Beans in der gesamten Anwendung verfügbar.
CASE 2:
Aber wenn ich gebe keinen Raum in Klassendeklaration:
class UserDetails {
...
}
Und injiziert wie diese (was Umfang an der Injektionsstelle):
@ViewScoped
class UserView {
@Inject @ApplicationScoped
UserDetails userDetails;
.
.
}
Dies ist fehlgeschlagen! .. Die injizierte Bohne hatnicht injiziertaber stattdessen dependent scope
(View Scope
in meinem Fall).
I hatte eine Producer
& a Qualifier
wo @Produces
Verfahren zu schaffen, wird das Bean in gewünschten application scope
bereitstellt. Ich denke, dass diese Producer/Qualifier-Erweiterung ein Overhead ist, wenn ich in diesem Fall die Bean-Klasse UserDetails in application scope
injizieren muss.
Die Sache ist, UserDetails Klasse ist Teil eines Drittanbieter-Jar. Diese Klasse hat keinen deklarierten Geltungsbereich und ist ein POJO. Ich kann den Quellcode nicht ändern.
Basierend auf der obigen Diskussion, ich habe zwei Fragen:
Warum jemand Bean-Klassen ohne Bereich definiert schaffen würde, wenn sie wissen, dass die Bohnen unter einem bestimmten Bereich injiziert werden sollen? Würde diese Praxis in puncto Design Vorteile bringen?
Da ich keine Kontrolle über den Quellcode der Bean-Klassen habe und sie keinem Bereich zugeordnet sind, ist Producer/Qualifier extension die einzige gute Möglichkeit, solche Beans in den gewünschten Bereich zu injizieren?
Auf eine Randnotiz könnten Sie dies bitte beantworten: Im Falle des Herstellers, weiß der CDI-Container bereits, dass das injizierte Objekt einen bestimmten Geltungsbereichstyp hat? Im Hintergrund unterscheidet sich die Injektion durch den Produzenten von der einfachen Injektion (Fall 1 meiner ursprünglichen Frage). – user2918640
Ja. CDI weiß, welcher Bereich für die Bean verwendet wurde. Der Bereich wird verwendet, wenn der Bereich definiert wird, wenn Sie Produzieren definieren. Sie können den Geltungsbereich der Bean nicht ändern, indem Sie beim Injizieren den Bereich definieren. – Loc