Ich habe Code mit faul initialisierte Bohnen zu initialisieren:Spring: wie ähnliche faule Bohnen nach der Erstellung Haupt Bohne
@Component @Lazy
class Resource {...}
@Component @Lazy @CustomProcessor
class ResourceProcessorFoo{
@Autowired
public ResourceProcessor(Resource resource) {...}
}
@Component @Lazy @CustomProcessor
class ResourceProcessorBar{
@Autowired
public ResourceProcessor(Resource resource) {...}
}
Nach initialize Anwendungskontext, gibt es keine Instanzen dieser Bohnen. Wenn die Bean-Ressource vom Anwendungskontext erstellt wird (z. B. applicationContext.getBean (Resource.class)), wurden keine Instanzen von @CustomProcessor als Beans markiert.
Es müssen Beans mit @CustomProcessor erstellt werden, wenn Resource Bean erstellt wird. Wie es geht?
Aktualisiert: Eine hässliche Lösung gefunden - verwenden leer autowired Setzer:
@Autowired
public void setProcessors(List<ResourceProcessor> processor){}
Eine andere hässliche Lösung mit Bohnen BeanPostProcessor
@Component
class CustomProcessor implements BeanPostProcessor{
public postProcessBeforeInitialization(Object bean, String beanName) {
if(bean instanceof Resource){
applicationContext.getBeansWithAnnotation(CustomProcessor.class);
}
}
}
Vielleicht ein eleganter Weg, es gibt (so Magie!)?
Formular java docs von @Lazy 'Wenn vorhanden und auf true gesetzt, wird @Bean oder @Component erst initialisiert, wenn es von einer anderen Bean referenziert oder explizit aus der einschließenden BeanFactory abgerufen wird. Ich denke, dass Sie @Lazy vom Prozessor entfernen oder einen Verweis in Resource Bean einfügen sollten. – Xstian
Nein, es funktioniert nicht, da ResourceProcessor keine Abhängigkeit von Resource ist. Wenn alle Komponenten nicht faul sind, funktioniert es natürlich korrekt, aber ich muss es mit einer lazinen Initialisierung machen. – mitallast
Sie könnten ein '@ PostConstruct' in Resource hinzufügen, um alle' Prozessoren' zu initialisieren. – Xstian