28.02.2012

Spring - Injection einer Liste von Implementierungen

Aufgrund einer einfachen Problematik bin ich über die Möglichkeit mehrere Beans einer Implementierung per @Autowired zu injecten, gestolpert.

Spring unterstützt den Entwickler an dieser Stelle durch bereits vorhandene Mechanismen, so dass keine eigene Implementierung erstellt werden muss. Die Konfiguration kann einfach und komfortabel über Annotationen realisiert werden.

Am einfachsten wird die Realisierung an einem kleinen Beispiel klar. Dafür wird ein Maven Projekt mit folgender Struktur erstellt.


Für das Beispiel selbst sind nur wenige Maven Dependencies zu definieren. Im Wesentlichen sind dies:
Weitere Abhängigkeiten sind für das einfache Beispiel nicht notwendig. Die Klassen sind definiert wie folgt:


Von der HelloWorldBean existieren insgesamt drei unterschiedliche Implementierungen, eine freundliche, eine normale und eine nicht ganz so freundliche ;-)
Die Liste der vorhandenen HelloWorldBean Implementierungen wird mittels Autowired in den HelloWorldService injected. Der Service fungiert je nach HelloWorldMode als Delegate für die sayHello() Methode der einzelnen HelloWorldBean Implementierungen.

Die Injection der verschiedenen Implementierungen wird über ein einfaches Autowired an einer Liste von HelloWorldBean Instanzen realisiert.


Mehr muss nicht getan werden, alles andere wird durch den Spring Container erledigt. Eine einfache Einführung in das Thema kann in der Dokumentation gefunden werden. Mit der Angabe der Annotation über der Liste der Bean Interfaces wird der Container dazu aufgefordert, alle Implementierungen des Interfaces HelloWorldBean in dieser Liste darzustellen. Somit kann sich der Entwickler darauf verlassen, dass alle im Context vorhandenen Beans, die dieses Interface implementieren, sich in dieser Liste befinden. Also kann in der Implementierung des HelloWorldService auf die Beans zurückgegriffen werden.


Im zugehörigen Unit-Test werden die unterschiedlichen Ausgaben und Verhaltensweisen des HelloWorldService getestet.


Vielleicht für den einen oder anderen hilfreich. Das Beispiel inkl. aller Tests findet sich wie immer im Repository.