2013-08-19 15 views
17

Sto migrando un'applicazione a Java EE 7 e desidero CDI 1.1. Ma non ho il significato di bean-discovery-mode="annotated". Il CDI 1.1 specification non è molto utile. Almeno non ho trovato alcun paragrafo utile. Mi è mancato?Significato della modalità di rilevamento dei bean annotata in CDI 1.1

Questo esempio funziona perfettamente con bean-discovery-mode="all" e inietta un'istanza di LoggingClass:

public class LoggingClass { 
    public Logger logger = Logger.getLogger("ALOGGER"); 

} 

@Test 
public class MMLoggerProducerIT extends Arquillian { 

    @Inject private LoggingClass lc; 

} 

Ma se cambio bean-discovery-mode="all"-bean-discovery-mode="annotated" il contenitore non è in grado di iniettare un'istanza nel campo lc.

Come è necessario annotare LoggingClass per utilizzare correttamente bean-discovery-mode="annotated"?

+0

Sto solo indovinando, ma penso che "@Named" o "@ManagedBean" sarebbero candidati? –

+1

@Mike_Braun Named esporrà un bean solo nel contesto EL ma non gli fornirà un ambito. ManagedBean è un'annotazione JSF, il motore CDI la ignorerà. – Yuri

risposta

27

In pratica, bean-discovery-mode="ALL" attiva la scansione di tutte le classi in un archivio. Questo è chiamato "archivio esplicito".

L'omissione beans.xml o l'impostazione bean-discovery-mode="ANNOTATED" rendono l'archivio un archivio implicito. In questo caso, il contenitore analizzerà i bean con tipi di ambito annotati.

Questo spiega perché LoggingClass non viene iniettato quando si imposta bean-discovery-mode="ANNOTATED". Come documentato in Java EE 7 Tutorial:

CDI può gestire e immettere i fagioli annotati con un tipo di ambito in un archivio implicito.

Modifica: quindi, per essere assolutamente chiari, è necessario aggiungere un tipo di ambito a LoggingClass. Quindi, qualcosa di simile:

@SessionScoped 
public class LoggingClass { 
    public Logger logger = Logger.getLogger("ALOGGER"); 
} 

In Java EE 7 e CDI 1.1, abbiamo rimosso l'obbligo di includere il descrittore beans.xml distribuzione per attivare la CDI per un archivio, portando CDI 1.1 in linea con la maggior parte delle altre API Java EE dove i descrittori di deployment sono facoltativi. Ha anche rimosso la natura on/off binaria di includere beans.xml oppure no. È possibile controllare quali file vengono scansionati dal contenitore con le impostazioni in bean-discovery-mode.

Vedere il tutorial JavaEE sugli imballaggi applicazioni CDI qui: http://docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm#CACDCFDE

+0

Se non è presente 'beans.xml', in che modo Intercettatori e Decoratori sono registrati e ordinati? C'è un modo? – noinstance

+1

@nosuchnick Gli intercettori possono essere ordinati tramite annotazioni usando '@ Interceptors' e' @ Priority', come descritto [nella sezione 54.2.5 qui] (http://docs.oracle.com/javaee/7/tutorial/doc/interceptors002 htm # GKHNI). –

+0

descrive come ottenere il funzionamento di @Produces? C'è un'annotazione che devo inserire nella classe Factory? –

23

Quando si utilizza bean-discovery-mode="annotated" solo le classi con un di fagioli che definisce l'annotazioneare discovered. Tutte le altre classi sono ignorate. Qualsiasi tipo di ambito è un'annotazione che definisce il bean. Se un tipo di ambito è dichiarato su una classe bean, la classe bean avrà un'annotazione che definisce il bean [specifica]. La specifica 1.1 non è completamente chiara qui. Vengono scoperte solo le classi con uno scope o lo pseudo scope @Dependent, @javax.inject.Singleton e tutti gli altri @Scope (pseudo) ambiti are ignored.

Si noti che la definizione di "annotazione di definizione del bean" è cambiata in CDI 1.2 ed è ora ben definite:

L'insieme di fagiolo annotazioni definiscono contiene:

  • @ApplicationScoped, @SessionScoped, @ConversationScoped e @RequestScoped annotazioni,
  • tutti gli altri tipi normali scope,
  • @Interceptor e @Decorator annotazioni,
  • tutte annotazioni stereotipo (cioè annotazioni annotati con @Stereotype), e l'annotazione portata @Dependent.
+1

questa dovrebbe essere la risposta accettata. – Chris

Problemi correlati