2015-06-12 26 views
5

Biorąc pod uwagę dwa fasola adnotacją z @Startup:Czy @DependsOn jest niezbędne dla innego wstrzykiwanego ziaren CDI?

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

@Singleton  
@Startup 
public B {} 

Czy @DependsOn neccessary w tej sytuacji, aby zapewnić, że B jest zainicjowany przed Ap Czy istnieje pewna konwencja dotycząca konfiguracji, która w takiej sytuacji kolejność zastrzyków określa kolejność inicjowania?

Oficjalny tutorial nie obejmuje tego przypadku, ale tylko fasole, które są tylko semantycznie pokryte bez żadnego połączenia syntaktycznego/okablowania przez @Inject.

Odpowiedz

1

Jeśli fasola A faktycznie zależy od inicjowanej fasoli B, to potrzebujesz tego.

Z @Startup robisz gorliwą instancję - singleton jest tworzony w momencie uruchamiania, niezależnie od tego, czy zostanie użyty.

W leniwych wystąpieniach singleton nie jest tworzony, dopóki nie zostaną najpierw zastosowane metody.

W obu przypadkach pojemnik może zainicjować fasoli na dowolnym kolejność chce:

Czasami kilka ziaren sesji Singleton są używane do inicjalizacji danych dla aplikacji i dlatego muszą być inicjowane w określonej kolejności. W takich przypadkach należy użyć adnotacji javax.ejb.DependsOn, aby zadeklarować zależności uruchamiania pojedynczego komponentu bean sesji.

1

Tak, to konieczne.

W przeciwnym razie nic nie gwarantuje, że B zostanie zainicjowany przed A.

Według JavaEE 6 documentation:

Czasami kilka ziaren sesji Singleton są używane do inicjalizacji danych dla aplikacji i dlatego muszą być inicjowane w określonej kolejności. W takich przypadkach należy użyć adnotacji javax.ejb.DependsOn, aby zadeklarować zależności uruchamiania pojedynczego komponentu bean sesji. Atrybut wartości adnotacji @DependsOn to jeden lub więcej ciągów określających nazwę docelowego pojedynczego komponentu bean sesji. Jeśli w @DependsOn podano więcej niż jedną zależną pojedynczą warstwę pojedynczą, kolejność, w jakiej są wymienione, niekoniecznie jest kolejnością, w której kontener EJB zainicjuje docelowe pojedyncze pojedynki sesyjne.

przykład:

Poniżej pojedyncza fasoli sesji PrimaryBean powinien być uruchomiony pierwszy:

@Singleton 
public class PrimaryBean { ... } 

SecondaryBean zależy PrimaryBean:

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

Gwarantuje to EJB kontener zainicjuje PrimaryBean przed SecondaryBean.

+0

Zawsze przeszkadzało mi, gdy naprawdę potrzebuję adnotacji @DependsOn. Ponieważ jeśli SecondaryBean potrzebuje PrimaryBean, prawdopodobnie oznacza to, że PB jest wstrzykiwany w SB i używany gdzieś, więc PB ma gwarancję, że zostanie zainicjowany przed pierwszym użyciem go w SB.Czy istnieje jakikolwiek rzeczywisty przypadek, w którym SB zależy od PB, ale go nie używa? – rychu