2013-10-15 12 views
6

Używam adnotacji @ContextConfiguration do zarządzania konfiguracjami w mojej aplikacji. Konfiguracje są tworzone w taki sposób, że dostarczają tylko ziarna, które są naświetlone przez dany moduł. Z tego powodu niektóre ziarna używane przez dany moduł niekoniecznie są importowane bezpośrednio. Przykład:Czy można wpływać na kolejność inicjowania klas konfiguracji w @ContextConfiguration?

configuration --(use)--> module1 --(cannot @Import)--> database 
       \-(use)--------------------------------> database 

W słowy configuration wykorzystuje module1 wymagającą (ale nie musi importować) konfiguracji bazy danych. Dlatego też configuration używa również modułu database.

Wygląda jednak na to, że kolejność, w jakiej rozpatrywane są przywozy, jest dość przypadkowa. Nawet jeśli używam

@ContextConfiguration(classes={DatabaseConfig.class, Module1Config.class}) 

Powoduje uszkodzenia indeterministyczną na inicjalizacji (NoSuchBeanDefinitionException).

Czy istnieje sposób wpływania na kolejność inicjacji fasoli? A może powinienem utworzyć nakładkę konfiguracji, które konfigurują się na zależnościach? Ale w takim przypadku to samo pytanie dotyczy @Import, ponieważ ma zapewnić kolejność ładowania zależności.

Odpowiedz

1

Ten problem wydaje się wynikać z tego, że dostępne są różne wersje sprężyny w tym samym czasie. Gdy kod pozostawiono do uruchomienia, tylko część z @Imports została załadowana metodą org.springframework.context.annotation.ConfigurationClassParser.collectImports(‌​AnnotationMetadata, Set<Object>, Set<Object>). Kiedy wykonanie zostało zawieszone przez punkt przerwania podczas analizowania, wszystko działało zupełnie dobrze.

Po wyczyszczeniu wielu wersji bibliotek źródłowych, problem zniknął. (Przynajmniej nie pojawił się ponownie po kilkunastu biegach.)

0

Myślę, że powinieneś użyć adnotacji @DependsOn - zaprojektowano ją dokładnie dla takich przypadków.

+0

Niestety, adnotacja @DependsOn po prostu czyni zależność jawną, ale nie powoduje cofnięcia, aby ewentualnie załadować brakujące ziarna z innych konfiguracji. – allprog

+0

Jaki jest prawdziwy problem, który próbujesz rozwiązać i dlaczego twoja zależna fasola nie powinna być opisana jako zależna od konfiguracji (może być przez interfejsy)? –

+0

Jeśli uwzględnię konfigurację DB w konfiguracji modułów, które jej używają, nie będzie można zmienić tej definicji DB na coś innego. Na przykład, jeśli chcę skupić się na testach jednostkowych na module wyższego poziomu, staram się unikać ładowania bazy danych i jak najszybciej próbuję złamać drzewo zależności. Albo tworzę różne konfiguracje do testowania i produkcji, albo tworzę konfiguracje w sposób skupiony i unikam zależności między nimi, w ten sposób w testach mogę wybrać, co ładuję. – allprog

Powiązane problemy