/ / Jarná nádoba IoC - Definujte závislosť na triedach označených konkrétnou anotáciou? - pružina

Kontajner na jar v systéme IoC - definujte závislosť na triedach označených konkrétnou anotáciou? - pružina

Mám fazuľa, ktorá skenuje triedy s anotáciou s konkrétnou anotáciou (doména špecifická). Chcem zabezpečiť, aby všetky fazuľa s poznámkami @MyDomainAnnotation sú inicializované a inštancované pred fazuľa, ktorá skenuje fazuľa s poznámkami @MyDomainAnnotation.

Existuje spôsob, ako definovať takúto závislosť, pretože je súčasťou rámca, a preto nové triedy môžu byť "pripojené". V podstate neviem názvy tried "vopred.

odpovede:

1 pre odpoveď č. 1

realizovať ApplicationListener<ContextRefreshedEvent> na skenovanie fazuľa.

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

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


0 pre odpoveď č. 2

Hoci som si zvolil implementáciuApplicationListener ako @Tichodroma navrhol, že som našiel aj iné riešenie, ktoré niekedy môže byť to, čo chcete, ak potrebujete ešte jemnejšiu kontrolu nad poradím "inicializácie" fazule. SmartLifecycle môžete poskytnúť fázové hodnoty, ktoré určia postupnosť (vo vzostupnom poradí), v ktorom sú vaše fazule inštanktované (t.j. fazuľa s najmenšími hodnotami fázy bude inicializovaná ako prvá).

Ale aj tak si myslím, že vyššie uvedená odpoveď je v mojom prípade elegantnejšia a čistá.