sonra ilgili tembel fasulye başlatmak için nasıl tembel başlatıldı fasulye kod var:Bahar: Ana fasulye oluşturma
@Component @Lazy
class Resource {...}
@Component @Lazy @CustomProcessor
class ResourceProcessorFoo{
@Autowired
public ResourceProcessor(Resource resource) {...}
}
@Component @Lazy @CustomProcessor
class ResourceProcessorBar{
@Autowired
public ResourceProcessor(Resource resource) {...}
}
initialize uygulama bağlamında sonra bu fasulye hiçbir örneği yoktur. Fasulye Kaynağı, uygulama bağlamı tarafından oluşturulduğunda (örneğin, applicationContext.getBean (Resource.class)), @CustomProcessor'un hiçbir örneği fasulye işaretlemez.
Kaynak çekirdeği oluşturulduğunda @CustomProcessor ile fasülyenin oluşturulması gerekir. Nasıl yapılır?
Güncelleme: çirkin çözümün biri Bulunan - Boş autowired ayarlayıcı kullanın: (! Yüzden sihirli) fasulye BeanPostProcessor
@Component
class CustomProcessor implements BeanPostProcessor{
public postProcessBeforeInitialization(Object bean, String beanName) {
if(bean instanceof Resource){
applicationContext.getBeansWithAnnotation(CustomProcessor.class);
}
}
}
Belki daha zarif bir yolu vardır ile
@Autowired
public void setProcessors(List<ResourceProcessor> processor){}
Başka çirkin çözüm?
Form java docs @Lazy 'Varsa ve true olarak ayarlanırsa, @Bean veya @Component başka bir fasulyenin referans verene kadar veya eklenecek BeanFactory'den açıkça alınana kadar başlatılamaz. İşlemciden @Lazy'yi kaldırmanız veya Kaynak çekirdeğinin içine bir referans koymanız gerektiğini düşünüyorum. – Xstian
Hayır, ResourceProcessor, Resource için bir bağımlılık olmadığı için işe yaramıyor. Tüm bileşenler tembel olmadığında, elbette doğru çalışır, ancak tembel başlatma – mitallast
ile yapmam gerekiyor Tüm 'İşlemciyi 'başlatmak için Kaynak içinde' @ PostConstruct' ekleyebilirsiniz. – Xstian