Blog

Verwendung von Spring JavaConfig auf Google App Engine

Andrew Phillips

Aktualisiert Oktober 23, 2025
6 Minuten

Vor kurzem habe ich eine Spring-Demonstration für jclouds, die Java-Cloud-Bibliothek, zusammengestellt. Dies entwickelte sich schnell zu einem unerwarteten, mehrdimensionalen Experiment zur Integration von Guice, Google App Engine und Spring, aber nach vielen Versuchen und Fehlern bin ich schließlich auf eine Konfiguration gestoßen, die den Zweck erfüllt - oder zumindest so gut funktioniert1, wie es auf GAE möglich scheint.

Die tweetstore Demo

Tweetstore ist eine einfache Webanwendung, die die Cloud-Fähigkeiten von jclouds demonstriert. Sie fragt Twitter nach Erwähnungen des Benutzerkontos ab und erstellt ein "Backup" dieser unbezahlbaren Aufzeichnung Ihres aktuellen Images in drei Cloud-Speichern: Amazon S3, Microsofts Azure und Rackspace. Nichts weniger als doppelte Redundanz ist gut genug für Ihre Popularität! Die ursprüngliche Tweetstore-Anwendung verwendet Guice für Dependency Injection und Request Mapping. Um den Vergleich zwischen der Spring-Version und dem Original so einfach wie möglich zu machen, habe ich beschlossen, so viel wie möglich in Java-Code zu machen. Eine perfekte Gelegenheit für mich, mir die Hände mit der Unterstützung von Spring 3.0 für die Java-Konfiguration schmutzig zu machen.

Bootstrapping der Java-Konfiguration von Spring

Der erste, relativ unkomplizierte Schritt bestand darin, das Guice-Servlet-Modul in eine entsprechende Spring @Configuration zu konvertieren: [java] @Configuration public class SpringServletConfig extends LoggingConfig implements ServletConfigAware { private ServletConfig servletConfig; ... @PostConstruct public void initialize() { ... } @Bohne public StoreTweetsController storeTweetsController() { StoreTweetsController controller = new StoreTweetsController(providerTypeToBlobStoreMap, container, twitterClient); injectServletConfig(controller); Controller zurückgeben; } @Bohne public AddTweetsController addTweetsController() { AddTweetsController controller = new AddTweetsController(providerTypeToBlobStoreMap, serviceToStoredTweetStatuses()); injectServletConfig(controller); Controller zurückgeben; } private void injectServletConfig(Servlet servlet) { versuchen { servlet.init(checkNotNull(servletConfig)); } catch (ServletException exception) { throw new BeanCreationException("Konnte nicht instanziiert werden " + Servlet, exception); } } @Bohne ServiceToStoredTweetStatuses serviceToStoredTweetStatuses() { return new ServiceToStoredTweetStatuses(providerTypeToBlobStoreMap, container); } @Bohne public HandlerMapping handlerMapping() { SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); Karte<String, Objekt> urlMap = Maps.newHashMapWithExpectedSize(2); urlMap.put("/store/", storeTweetsController()); urlMap.put("/tweets/", addTweetsController()); mapping.setUrlMap(urlMap); /*

Verfasst von

Andrew Phillips

Contact

Let’s discuss how we can support your journey.