Ho codice con i fagioli inizializzati pigri:primavera: come inizializzare correlati fagioli pigri dopo la creazione di fagioli principale
@Component @Lazy
class Resource {...}
@Component @Lazy @CustomProcessor
class ResourceProcessorFoo{
@Autowired
public ResourceProcessor(Resource resource) {...}
}
@Component @Lazy @CustomProcessor
class ResourceProcessorBar{
@Autowired
public ResourceProcessor(Resource resource) {...}
}
Dopo contesto di applicazione di inizializzazione, non c'è nessun caso di questo fagioli. Quando la risorsa bean viene creata dal contesto dell'applicazione (ad esempio, applicationContext.getBean (Resource.class)), nessuna istanza di @CustomProcessor ha contrassegnato i bean.
È necessario creare bean con @CustomProcessor quando viene creato il bean di risorse. Come farlo?
Aggiornato: Uno dei brutti soluzione trovata - utilizzare vuoto autowired setter:
@Autowired
public void setProcessors(List<ResourceProcessor> processor){}
Un'altra brutta soluzione con il fagiolo BeanPostProcessor
@Component
class CustomProcessor implements BeanPostProcessor{
public postProcessBeforeInitialization(Object bean, String beanName) {
if(bean instanceof Resource){
applicationContext.getBeansWithAnnotation(CustomProcessor.class);
}
}
}
Forse c'è un modo più elegante (così magico!)?
Form java docs di @Lazy 'Se presente e impostato su true, @Bean o @Component non verranno inizializzati fino a quando non vengono referenziati da un altro bean o recuperati esplicitamente dall'accluso BeanFactory'. Penso che dovresti rimuovere @Lazy dal processore o inserire un riferimento all'interno del bean Resource. – Xstian
No, non funziona perché ResourceProcessor non è una dipendenza per Risorsa. Quando tutti i componenti non sono pigri, naturalmente, funziona correttamente, ma ho bisogno di farlo con l'inizializzazione pigra – mitallast
È possibile aggiungere un '@ PostConstruct' all'interno di Risorsa per inizializzare tutto' Processore'. – Xstian