SpringServletContextObjectSupplier
Die Verwendung bietet sich an, wenn Axis2 im Rahmen einer Webanwendung läuft oder in eine bestehende Webanwendung eingebettet werden soll, die das Spring Framework verwendet. Eine Webanwendung, die auf Spring aufbaut, verwendet in aller Regel einen in der Datei web.xml konfigurierten und von Spring bereitgestellten ContextLoaderListener. Dieser teilt Spring mit, wo sich in der Webanwendung die entsprechende Spring-Konfiguration (der Application Context) befindet. Listing 1 zeigt eine beispielhafte Konfiguration von Spring in einer web.xml, in der festgelegt wird, dass der Application Context aus der Datei spring-app-context.xml aufgebaut werden soll, die sich direkt im WEB-INF-Verzeichnis der Webanwendung befindet.
Listing 1: Ausschnitt aus der Datei web.xml zur Konfiguration von Spring
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-app-context.xml</param-value></context-param>
Besteht die Aufgabe nun also darin, bestimmte Services aus einer Webanwendung, die als Spring Beans vorliegen, mit einer Web-Service-Schnittstelle auszustatten, dann verwendet man üblicherweise SpringServletContextObjectSupplier. Das Deployment wird dabei zum Kinderspiel, denn das Service-Archiv besteht hier letztlich nur noch aus einem Deployment-Deskriptor (services.xml), in dem der Object Supplier konfiguriert wird, wie das Beispiel in Listing 2 zeigt.
Listing 2: Deployment Deskriptor in dem der SpringServletContextObjectSupplier konfiguriert wird
<service name="BankleitzahlSpringServletContext"><description>Service der die Spring-BLZ-Implementierungüber den ServletContext bereitstellt</description><parameter name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier</parameter><parameter name="SpringBeanName">bankleitzahlService</parameter><operation name="searchBlz"><messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /></operation></service>
SpringAppContextAwareObjectSupplier
Wenn man jedoch die Anforderung hat, sämtliche Spring Beans und deren Konfiguration isoliert in einem Service-Archiv (AAR) zu halten, weil ein Einbetten in eine bestehende Webanwendung nicht möglich oder gestattet ist, dann bietet sich die Verwendung des SpringAppContextAwareObjectSuppliers an. Während SpringServletContextObjectSupplier seine Spring-Konfiguration aus dem Servlet-Kontext der Webanwendung bezieht, muss der Entwickler bei Verwendung von SpringAppContextAwareObjectSupplier Axis2 mitteilen, wo die Spring-Konfiguration zu finden ist. Darüber hinaus ist man selbst dafür zuständig, den Application Context hochzufahren. Um dies zu bewerkstelligen, muss dem Service-Archiv zusätzlich zu den eigentlichen Spring Beans und deren Konfiguration (Application Context) noch eine spezielle Web-Service-Implementierung mitgegeben werden, der das Axis2-Interface ServiceLifeCycle implementiert. Diese spezielle Implementierung ist letztlich dafür verantwortlich, vor der ersten Verwendung des Web Service die Spring-Konfiguration zu lesen und den Application Context aufzubauen. Die Idee hinter dem ServiceLifeCycle-Interface kann man mit Servlets vergleichen: Analog zu den Methoden init und destroy bei Servlets, bieten die Methoden startUp und shutDown in ServiceLifeCycle-Implementierungen die Möglichkeit, entsprechende Initialisierungs- und Aufräumarbeiten durchzuführen. In Listing 3 sieht man eine beispielhafte Implementierung von ServiceLifeCycle, die einen Spring Application Context innerhalb eines AARs hochfährt.
Listing 3: Ausschnitt aus der Datei web.xml zur Konfiguration von Spring
public class SpringInit implements ServiceLifeCycle {private static final String BLZ_CONTEXT_XML ="spring-app-context.xml";// Dummy-Methode, dieser Service soll ja nur den// Application Context hochfahren !public OMElement springInit(OMElement ignore) {return null;}public void startUp(ConfigurationContext configctx,AxisService service) {try {ClassLoader classLoader = service.getClassLoader();ClassPathXmlApplicationContext applicationContext = newClassPathXmlApplicationContext( new String[]{ BLZ_CONTEXT_XML }, false);applicationContext.setClassLoader(classLoader);applicationContext.refresh();} catch (Exception e) {e.printStackTrace();}}public void shutDown(ConfigurationContext configctx,AxisService service) {}}
Eine detaillierte Beschreibung der soeben vorgestellten Object Supplier für die Spring-Integration mit Axis2 würde den Rahmen dieses Artikels sprengen, daher sei an dieser Stelle auf das Axis2-Buch verwiesen. Hier wird vollständig und mit vielen Beispielen (siehe Kapitel 12, ab Seite 386 ff) beschrieben, was mit Object Suppliers möglich ist.














