With or without SpringSource dm Server
Der SpringSource dm Server ist eine sehr interessante Plattform, um Anwendungen mit Spring zu deployen. Allerdings wollen noch nicht alle Organisationen den Schritt wagen, mit diesem Server gleich in Produktion zu gehen. Dieses Posting zeigt, wie man eine Spring-Konfiguration erstellen kann, die auch ohne dm Server funktioniert.
Wir bauen einen Shop zur Auslieferung individuell gebauter Mountain Bikes. Nehmen wir an, wir haben eine Komponente für die Konfiguration von Mountain Bikes in einem File
configuration.jar. Dort findet sich in
/META-INF/spring/beans.xml folgendes:
<beans ...>
<bean id="configurationFacade"
class="configurator.ConfiguratorFacadeImpl">…
</bean>
</beans>
Diese Spring-Bean
configurationFacade soll als OSGi-Service exportiert werden. Daher findet sich in
/META-INF/spring/osgi.xml
in
configuration.jar folgendes:
<beans ...>
<osgi:service ref="configurationFacade"
interface="configurator.ConfiguratorFacade" />
</beans>
In dem Order-Bundle soll dieser Service verwendet werden. Also findet sich in
/META-INF/spring/beans.xml innerhalb von
order.jar dann eine Referenz auf diesen OSGi-Service:
<beans ...>
<osgi:reference id="configurationFacade"
interface="configurator.ConfiguratorFacade" />
</beans>
und diese Spring-Bean wird dann anderswo im
order.jar in
/META-INF/spring/beans.xml verwendet:
<beans ...>
<bean>
<property name="configurationFacade" ref="configurationFacade"/>
</bean>
</beans>
Soweit also die Konfiguration für den dm Server. Ohne den dm Server funktioniert das ganze aber auch - man muss lediglich
classpath*:/META_INF/spring/beans.xml für die Erzegung des ApplicationContext benutzen. Dadurch werden alle Dateien
/META-INF/spring/beans.xml aus allen Jar-Files für die Bildung des ApplicationContext genutzt. Die Referenz auf
configurationFacade in
/META-INF/spring/beans.xml innerhalb von
order.jar wird also direkt auf die Spring Bean
configurationFacade aus
/META-INF/spring/beans.xml von
configuration.jar gelenkt.
Die Facade wird also direkt benutzt und nicht als OSGi-Service. Der Inhalt der
osgi.xml-Dateien wird ignoriert. Nun kann man sicher sagen, dass hier die Wahl der Namen geschickt ist, so dass es zufällig funktioniert. Man kann aber mit
<alias> einer Bean zusätzliche Namen geben, um solche Probleme zu vermeiden. Ganz verschont bleibt man von Namensproblemen aber nicht: Es kann immer noch sein, dass ein Name doppelt verwendet wird. Hier bietet es sich an, mit Prefixen zu arbeiten. So könnte man alle Beans aus
order.jar ein
order- Präfix geben.
So oder so: Man kann Spring-Anwendungen für dm Server bauen, dort testen und damit entwickeln. Sollte man dann im Betrieb eine andere Plattform benötigen - trotz der Vorteile die dm Server gerade in diesem Bereich hat - kann man hier flexibel sein. Allerdings verliert man dadurch auch die Modularisierung durch OSGi. So kann man weder die Sichtbarkeit der Typen genau regeln noch kann man Bundles zur Laufzeit austauschen.
Labels: dm Server, Spring