Unter diesem sperrigen Titel möchte ich auf die Fallstricke hinweisen die beim manuellen Registrieren von Beans auftreten können.
Beispiel für die manuelle Erstellung einer BeanDefinition mit Angabe eines Qualifiers (in diesem Fall der SimpleName der Bean)
1 2 3 4 5 6 |
GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); beanDefinition.setBeanClass(type); beanDefinition.setLazyInit(true); beanDefinition.setAbstract(false); beanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR); beanDefinition.addQualifier(new AutowireCandidateQualifier(Qualifier.class, type.getSimpleName())); |
Der größte Aha-Effekt liegt in der letzten Zeile.
Denn vorher sah meine Definition des AutowireCandidateQualifier wie folgt aus:
1 |
beanDefinition.addQualifier(new AutowireCandidateQualifier(type.getSimpleName())); |
Was aber nicht funktioniert und in einer sagen wir mal länger gezogenen Debug-Session hab ich dann entdeckt das im
org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver
folgendes geprüft wird:
1 |
AutowireCandidateQualifier qualifier = bd.getQualifier(type.getName()); |
bd steht hierbei für die BeanDefinition und type ist org.springframework.beans.factory.annotation.Qualifier.
Da ich den Qualifier anfangs nicht mit deklariert hatte, konnte es ja nicht klappen. Mit der Angabe des Qualifiers ging es dann. Halleluja!
Ein manuelles Abfragen der Qualifier-Informationen ist wie folgt möglich.
1 2 3 |
GenericBeanDefinition beanDefinition = (GenericBeanDefinition) applicationContext.getBeanDefinition((String) componentClassName); AutowireCandidateQualifier autowireCandidateQualifier = beanDefinition.getQualifier(Qualifier.class.getName()); Object acutalQualifierValue = autowireCandidateQualifier.getAttribute("value"); |
Gearbeitet habe ich in diesem Fall mit der Spring-Version 3.1.0.RELEASE.