SpringFramework XML-Config und Annotations mixen

Wer „Spring“ hört, denkt meistens sofort an riesige XML-Konfigurationen, und der ein oder andere verspürt das Bedürfnis, direkt über Spring herziehen zu müssen. Tatsächlich kann man aber inzwischen so ziemlich alles auch per Annotations konfigurieren.
Hin und wieder kommt man aber nicht umher, beides zu mischen – z.B. wenn es darum geht ein altes Projekt nach und nach zu refactoren und nicht alles auf einmal vom Kopf auf die Füße gestellt werden soll oder kann.

Dabei das wichtigste direkt vorweg. Wenn es nur darum geht per  context:component-scan  und  context:annotation-config  bestehende Beans zu erzeugen und zu injecten, dann ist das ohne weiteres möglich. Im Prinzip sind nur 4 Zeilen Code:

Das XML muss dabei im günstigen Fall nicht komplexer aussehen als:

Spannender wird es aber, wenn noch Klassen existieren, die ihrerseits als BeanFactory fungieren bzw. per Annotation als solche definiert wurden. Bspw.:

Die Zuvor geschilderte Konfiguration würde zwar eine Bean für ExampleBeanProvider erzeugen, nicht aber für ExampleBean.
Um das zu lösen, müssen wir den Annotations dediziert zu Leibe rücken. Zum Beispiel mit einem AnnotationConfigApplicationContext:

Wird der Classpath im Constructor angegeben, wird direkt ein Scan durchgeführt. Alternativ könnte man das auch später tun:

Da wir natürlich für die Beans aus der XML-Konfiguration die selbe BeanFactory benutzen möchten, müssen wir zum Parsen etwas anders vorgehen, indem wir keine neue DefaultListableBeanFactory erzeugen, sondern die aus dem Context benutzen:

Zu beachten wäre dabei nur noch, dass der AnnotationConfigApplicationContext natürlich zuerst zum Zug kommt. Das ist wichtig, weil es zu Problemen führen kann. Zum Beispiel wenn man spring-aop benutzen möchte und den Aspect per Annotation konfiguriert aber die aop-config in der XML definiert. Aber dazu mehr in einem anderen Blogeintrag über gewisse Eigenarten von spring-aop und mögliche Fallstricke.

Das könnte Dich auch interessieren...

1 Antwort

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen