2015-06-12 14 views
5

Dati due fagioli annotate con @Startup:@DependsOn è necessario per un altro bean CDI che viene iniettato?

@Singleton  
@Startup 
@DependsOn("B") 
public A { 
    @Inject 
    private B b; 
} 

@Singleton  
@Startup 
public B {} 

Is neccessary @DependsOn in questa situazione per garantire che B viene inizializzato prima di A? O c'è qualche convenzione sulla configurazione che in una situazione del genere l'ordine delle iniezioni determina l'ordine di inizializzazione?

Il tutorial ufficiale non copre questo caso ma solo i bean che sono semplicemente semanticamente coperti senza alcun collegamento sintattico/di cablaggio tramite @Inject.

risposta

1

Se il bean A in realtà dipende dal bean B che viene inizializzato, è necessario.

Con @Startup si sta eseguendo un'irrigiazione stimolante - il singleton viene istanziato all'avvio indipendentemente dal fatto che venga utilizzato o meno.

Nell'istanza lazy, il singleton non viene istanziato fino a quando non sono prima necessari i metodi.

In entrambi i casi, il contenitore è possibile inizializzare i fagioli a seconda di quale ordine si vuole:

volte più bean di sessione Singleton vengono utilizzate per inizializzare i dati di un'applicazione e, pertanto, devono essere inizializzati in un ordine specifico. In questi casi, utilizzare l'annotazione javax.ejb.DependsOn per dichiarare le dipendenze di avvio del bean di sessione singleton.

1

Sì, è necessario.

Altrimenti nulla garantisce che B verrà inizializzato prima dello A.

Secondo il JavaEE 6 documentation:

volte più bean di sessione Singleton vengono utilizzate per inizializzare i dati di un'applicazione e, pertanto, devono essere inizializzati in un ordine specifico. In questi casi, utilizzare l'annotazione javax.ejb.DependsOn per dichiarare le dipendenze di avvio del bean di sessione singleton. L'attributo del valore dell'annotazione @DependsOn è una o più stringhe che specificano il nome del bean di sessione singleton di destinazione. Se è specificato più di un bean singleton dipendente in @DependsOn, l'ordine in cui sono elencati non è necessariamente l'ordine in cui il contenitore EJB inizializzerà i bean di sessione singleton di destinazione.

Esempio:

Il seguente session bean Singleton, PrimaryBean, deve essere avviato prima:

@Singleton 
public class PrimaryBean { ... } 

SecondaryBean dipende PrimaryBean:

@Singleton 
@DependsOn("PrimaryBean") 
public class SecondaryBean { ... } 

Ciò garantisce che il bean contenitore inizializzerà PrimaryBean prima dello SecondaryBean.

+0

Mi ha sempre infastidito se ho davvero bisogno dell'annotazione @DependsOn. Perché se SecondaryBean ha bisogno di PrimaryBean probabilmente significa che PB è iniettato in SB e usato da qualche parte così PB è garantito per essere inizializzato prima di usarlo per la prima volta in SB.Esiste un caso reale in cui SB dipende da PB ma non lo usa? – rychu

Problemi correlati