/ / Spring IoC container - Definiowanie zależności od klas z adnotacją? - wiosna

Kontener Spring IoC - Definiowanie zależności od klas z adnotacją? - wiosna

Mam komponent bean, który skanuje dla zajęć z adnotacją (konkretną domeną). Chcę mieć pewność, że wszystkie fasole są opatrzone adnotacją @MyDomainAnnotation są inicjalizowane i tworzone przed komponentem bean, do którego przypisywane są skanowane fasole @MyDomainAnnotation.

Czy istnieje sposób na zdefiniowanie takiej zależności, ponieważ jest to część struktury i dlatego nowe klasy mogą być "podłączone". Zasadniczo nie znam już nazw klas.

Odpowiedzi:

1 dla odpowiedzi № 1

Wprowadzić w życie ApplicationListener<ContextRefreshedEvent> na twojej fasoli skanującej.

public class MyScanningBean implements ApplicationListener<ContextRefreshedEvent> {

private boolean scanned = false;

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
/* Published when the ApplicationContext is initialized or refreshed,
* for example, using the refresh() method on the
* ConfigurableApplicationContext interface. "Initialized" here means
* that all beans are loaded, post-processor beans are  detected and
* activated, singletons are pre-instantiated, and the
* ApplicationContext  object is ready for use. */

if (!scanned) {
// scan for beans
scanned = true;
}
}
}

Widzieć http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#context-functionality-events


0 dla odpowiedzi nr 2

Chociaż zdecydowałem się na wdrożenieApplicationListener jako @Tichodroma zasugerował, że znalazłem także inne rozwiązanie, które czasami może być tym, czego potrzebujesz, jeśli potrzebujesz drobniejszej kontroli nad kolejnością inicjalizacji "fasoli". SmartLifecycle możesz podać wartości fazowe, które określą kolejność (w kolejności rosnącej), w której tworzone są komponenty bean (to znaczy najpierw zostaną zainicjowane komponenty o najmniejszych wartościach fazowych).

Ale w każdym razie myślę, że powyższa odpowiedź jest bardziej elegancka i czysta w moim przypadku.