2017-03-15 2 views
4

Ich habe eine Methode mit einer @Produces Annotation, die eine Apple erstellt.Verhalten der Methode mit @Products Annotation ohne Bereich

Wenn ich es mit @ApplicationScoped wie diese

public class AppleProducer { 
    @ApplicationScoped 
    @Produces 
    public Apple createApple() { 
     return new Apple(); 
    } 
} 

dann das Apple nur einmal für die gesamte Anwendung erstellt wird.

Wenn ich es mit @RequestScoped wie diese

public class AppleProducer { 
    @RequestScoped 
    @Produces 
    public Apple createApple() { 
     return new Apple(); 
    } 
} 

dann für jede Anforderung erstellt wird.

Aber was ist, wenn ich keinen Bereich angeben?

Wie oft wird der Apple erstellt? Ich vermute bei jedem Zugriff, ist das richtig? Gibt es Dokumentation darüber?

Antwort

5

Vom CDI (1.2) Spezifikation

Wenn kein Anwendungsbereich ausdrücklich mit Anmerkungen versehen, die Bean-Klasse oder Producer-Methode oder Feld, um den Umfang einer Bohne erklärt wird, vorgeschlagen.

Der Standardbereich für eine Bean, den hängt von ihren erklärten Stereotyp nicht explizit einen Umfang nicht erklären:

• Wenn die Bohne erklärt kein Klischee mit einem deklarierten Standard Umfang, den Standardbereich für die Bean ist abhängig.

• Wenn alle Stereotypen, die von der Bean deklariert wurden und die einen bestimmten Standardbereich für deklariert haben, den gleichen Standardbereich haben, ist dieser Bereich der Standardbereich für die Bean .

• Wenn es zwei verschiedene Stereotypen von der Bohne erklärt, die verschiedene Standardbereiche erklären , dann gibt es keinen Standardbereich und die Bean muss explizit einen Umfang erklären. Wenn es nicht ausdrücklich einen Bereich deklariert, erkennt der Container das Problem automatisch und behandelt es als einen Definitionsfehler.

Wenn eine Bean explizit einen Bereich deklariert, werden alle Standardbereiche ignoriert, die von Stereotypen deklariert werden.

können Sie die Spezifikation von hier herunterladen http://www.cdi-spec.org/download/

0

Wie Sie jeden Scope nicht definieren, Ihre produzierte Bohne @Dependent von defaut sein wird.

Dies bedeutet, dass der Lebenszyklus der produzierten Bohne der Lebenszyklus der Bohne ist, die sie injiziert.

Also, wenn Sie die folgenden Hersteller haben:

public class AppleProducer { 
    @Produces 
    public Apple createApple() { 
     return new Apple(); 
    } 
} 

Wenn Sie einen Apple in einem @ApplicationScopedPie Bean injizieren:

@ApplicationScoped 
public class Pie { 

    @Inject 
    private Apple apple; 
} 

Dann wird die Apple Bohne wird @ApplicationScoped sein, so nur ein einziges Mal erstellt . Wenn die Pie Bean @RequestScoped ist, wird die Bean Apple bei jeder Anforderung erstellt.

Verwandte Themen