/ / Contenitore IoC di primavera - Definire la dipendenza dalle classi annotate con un'annotazione specifica? - primavera

Contenitore IoC di primavera - Definire la dipendenza dalle classi annotate con un'annotazione specifica? - primavera

Ho un bean che analizza le classi annotate con una particolare annotazione (una specifica di dominio). Voglio assicurarmi che tutti i fagioli annotati con @MyDomainAnnotation sono inizializzati e istanziati prima del bean che esegue la scansione dei bean con annotati @MyDomainAnnotation.

C'è un modo per definire una dipendenza come questa fa parte di un framework e quindi le nuove classi potrebbero essere "collegate". Fondamentalmente non conosco i nomi delle classi in anticipo.

risposte:

1 per risposta № 1

Strumento ApplicationListener<ContextRefreshedEvent> sul tuo fagiolo di scansione.

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;
}
}
}

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


0 per risposta № 2

Sebbene io abbia optato per l'implementazioneApplicationListener come @Tichodroma mi ha suggerito di trovare anche un'altra soluzione che a volte potrebbe essere ciò che si desidera se si ha bisogno di un'inizializzazione del controllo più fine sull'ordine dei fagioli ". SmartLifecycle è possibile fornire valori di fase che determineranno la sequenza (in ordine ascendente) in cui i bean vengono istanziati (cioè i bean con i valori di fase più piccoli verranno inizializzati per primi).

Ma comunque penso che la risposta di cui sopra sia più elegante e pulita nel mio caso.