2012-12-07 5 views
24

Czy istnieje kolejność określania kolejności, w której komponenty bean mają być tworzone? tzn. chcę, aby określone komponenty bean były tworzone przed innymi komponentami bean, podobnie jak sekwencja uruchamiania.Sekwencja inicjacji sprężystej 3-komponentowej fasoli

Używam metody deklaracji opartej na Spring 3.2 i adnotacji.

+0

W mojej praktyce sekwencja wystąpienia jest równa kolejności w pliku konfiguracyjnym xml. Ale mogą być wyjątki .. –

Odpowiedz

52

Jeśli fasola zależy fasoli B definiując <property/>, @Autowired lub <constructor-arg/> czym kolejność jest wymuszony i ustala pojemnika wiosennego. Nie ma problemu.

Ale jeśli chcesz wymusić określony porządek stworzenia fasoli, które nie ulega ekspresji poprzez wyraźne zależności czuć swobodnie korzystać:

<bean id="A" depends-on="B"/> 
<bean id="B"/> 

lub lepsza (z adnotacjami, współpracuje również z @Bean konfiguracji Java):

@Service 
@DependsOn("B") 
public class A {} 

lub nawet lepiej ... nie używaj go. Te konstrukcje są zapachem kodu i często sugerują, że masz jakąś nieprzyjemną niewidzialną zależność między twoimi komponentami.

+5

+1 dla wyjaśnienia zapachu kodu – ElderMael

3

Możesz użyć interfejsu Uporządkowany na swojej fasoli, aby zdefiniować porządek względem innych ziaren.

5

Uzgodniono z odpowiedzią udzieloną przez Tomasza. Jeśli wiesz, że ziarno A zależy od fasoli B, to jest właściwe podejście.

Czasami masz logikę, która powinna zostać wykonana przed utworzeniem wszystkich komponentów bean. W takim przypadku możesz użyć BeanFactoryPostProcessor. Spring tworzy i wykonuje najpierw BeanFactoryPostProcessors, a następnie tylko wszystkie inne komponenty bean. W tym samym czasie, jeśli Twój BeanFactoryPostProcessor zależy od jakiegoś komponentu A, możesz użyć wtrysku właściwości lub konstruktora. W tym przypadku Spring utworzy komponent bean A first, a następnie BeanFactoryPostProcessor, wywoła BeanFactoryPostProcessor, a następnie zainicjuje wszystkie pozostałe komponenty bean w kontekście.

+0

Użyłem tego, aby ustawić ustawienie spring.active.profile z pliku właściwości systemu. Działa świetnie! –