Craig Walls, Ryan Breidenbach Spring im Einsatz Übersetzt aus dem Englischen von Christian Alkemper, Jürgen Dubau ISBN-10: 3-446-41240-9 ISBN-13: 978-3-446-41240-8 Inhaltsverzeichnis Weitere Informationen oder Bestellungen unter http://www.hanser.de/978-3-446-41240-8 sowie im Buchhandel
Inhalt Vorwort...XV Danksagung...XIX Zu diesem Buch...XVII Teil 1: Der Kern von Spring...XX 1 Spring ins kalte Wasser... 3 1.1 Was ist Spring?... 4 1.1.1 Die Spring-Module... 6 1.2 Der erste Schritt... 10 1.3 Überblick über die Dependency Injection... 13 1.3.1 Abhängigkeiten injizieren... 13 1.3.2 DI im Einsatz... 14 1.3.3 DI in Unternehmensanwendungen... 20 1.4 Die aspektorientierte Programmierung... 22 1.4.1 Einführung in AOP... 22 1.4.2 AOP im Einsatz... 23 1.5 Zusammenfassung...27 2 Grundlagen der Bean-Verschaltung... 29 2.1 Beans im Container... 30 2.1.1 Grundlagen zur BeanFactory... 31 2.1.2 Mit einem Anwendungskontext arbeiten... 33 2.1.3 Ein Bohnenleben... 34 2.2 Beans erstellen... 37 2.2.1 Eine einfache Bean deklarieren... 37 2.2.2 Injektion über Konstruktoren... 38 2.3 Injektion in Bean-Eigenschaften... 43 2.3.1 Einfache Werte injizieren... 44 2.3.2 Andere Beans referenzieren... 45 2.3.3 Collections verschalten... 48 2.3.4 Nichts (null) verschalten... 53 VII
2.4 Autowiring...54 2.4.1 Die vier Typen des Autowiring...54 2.4.2 Gemischter Einsatz von automatischer und expliziter Verschaltung...58 2.4.3 Autowiring: Ja oder nein?...58 2.5 Steuerung der Bean-Erstellung...60 2.5.1 Geltungsbereiche für Beans...60 2.5.2 Beans aus Factory-Methoden erstellen...61 2.5.3 Beans initialisieren und zerstören...63 2.6 Zusammenfassung...65 3 Fortgeschrittene Bean-Verschaltung... 67 3.1 Abgeleitete Beans deklarieren...68 3.1.1 Abstrahieren eines Bean-Basistyps...68 3.1.2 Gemeinsame Eigenschaften abstrahieren...71 3.2 Die Methodeninjektion...73 3.2.1 Methodenersetzung...74 3.2.2 Die Getter-Injektion...77 3.3 Nicht-Spring-Beans injizieren...79 3.4 Editoren für benutzerdefinierte Eigenschaften registrieren...81 3.5 Mit speziellen Spring-Beans arbeiten...84 3.5.1 Beans nachbearbeiten...85 3.5.2 Nachbearbeitung der BeanFactory...87 3.5.3 Konfigurationseigenschaften externalisieren...89 3.5.4 Textnachrichten auflösen...91 3.5.5 Entkopplung mit Anwendungsereignissen...92 3.5.6 Bewusstseinserweiterung für Beans...95 3.6 Skript-Beans...97 3.6.1 Wie die Limone in die Kokosnuss kommt...98 3.6.2 Beans skripten...99 3.6.3 Eigenschaften von Skript-Beans injizieren...102 3.6.4 Skript-Beans aktualisieren...103 3.6.5 Skript-Beans inline schreiben...103 3.7 Zusammenfassung...104 4 AdviceBeans... 107 4.1 Einführung in AOP...108 4.1.1 Die Terminologie zu AOP...109 4.1.2 Der AOP-Support in Spring...112 4.2 Klassische Spring-Aspekte erstellen...115 4.2.1 Advices erstellen...117 4.2.2 Pointcuts und Advisors definieren...122 4.2.3 ProxyFactoryBeans verwenden...125 4.3 Autoproxying...128 4.3.1 Autoproxys für Spring-Aspekte erstellen...129 4.3.2 Autoproxying von @AspectJ-Aspekten...130 4.4 Pure-POJO-Aspekte deklarieren...133 VIII
4.5 AspectJ-Aspekte injizieren... 137 4.6 Zusammenfassung... 140 Teil 2: Spring für Unternehmen... 141 5 Zugriff auf die Datenbank... 143 5.1 Die Philosophie des Datenzugriffs in Spring... 144 5.1.1 Die Exception-Hierarchie beim Datenzugriff in Spring... 146 5.1.2 Datenzugriffsschablonen... 148 5.1.3 Klassen für den DAO-Support... 150 5.2 Datenquelle konfigurieren... 152 5.2.1 JNDI-Datenquellen verwenden... 152 5.2.2 Pooldatenquelle verwenden... 154 5.2.3 Auf JDBC-Treiber basierende Datenquelle... 155 5.3 JDBC und Spring gemeinsam verwenden... 156 5.3.1 Wie man JDBC-Code in den Griff bekommt... 157 5.3.2 Mit JDBC-Vorlagen arbeiten... 159 5.3.3 Springs DAO-Supportklassen für JDBC verwenden... 165 5.4 Hibernate und Spring integrieren... 168 5.4.1 Hibernate-Version auswählen... 170 5.4.2 Hibernate-Vorlagen verwenden... 171 5.4.3 DAOs auf Hibernate-Basis erstellen... 174 5.4.4 Kontextabhängige Sessions in Hibernate 3... 176 5.5 Spring und die Java Persistence API... 178 5.5.1 JPA-Vorlagen verwenden... 178 5.5.2 Entity-Manager-Factory konfigurieren... 181 5.5.3 DAOs auf JPA-Basis erstellen... 185 5.6 Spring und ibatis... 186 5.6.1 ibatis-clientvorlage konfigurieren... 187 5.6.2 DAOs auf ibatis-basis erstellen... 189 5.7 Caching... 191 5.7.1 Caching-Lösung konfigurieren... 192 5.7.2 Bean-Proxys für das Caching erstellen... 196 5.7.3 Annotationsgetriebenes Caching... 198 5.8 Zusammenfassung... 200 6 Transaktionen verwalten... 201 6.1 Grundlagen zu Transaktionen... 202 6.1.1 Transaktionen mit vier Wörtern erklärt... 203 6.1.2 Spring-Support für die Transaktionsverwaltung... 204 6.2 Auswahl eines Transaktionsmanagers... 205 6.2.1 JDBC-Transaktionen... 207 6.2.2 Hibernate-Transaktionen... 207 6.2.3 JPA-Transaktionen... 208 6.2.4 JDO-Transaktionen... 209 6.2.5 JTA-Transaktionen... 209 IX
6.3 Transaktionen in Spring programmieren...210 6.4 Transaktionen deklarieren...212 6.4.1 Transaktionsattribute definieren...213 6.4.2 Transaktions-Proxys...217 6.4.3 Transaktionen in Spring 2.0 deklarieren...220 6.4.4 Annotationsgetriebene Transaktionen definieren...222 6.5 Zusammenfassung...224 7 Spring absichern... 225 7.1 Einführung in Spring Security...226 7.2 Benutzer authentifizieren...230 7.2.1 Einen Provider-Manager konfigurieren...231 7.2.2 Authentifizierung gegenüber einer Datenbank...233 7.2.3 Authentifizierung gegenüber einem LDAP-Repository...240 7.3 Zugriffssteuerung...246 7.3.1 Über Zugriffsentscheidungen abstimmen...247 7.3.2 Die Stimmabgabe...248 7.3.3 Stimmenthaltungen...249 7.4 Webanwendungen absichern...250 7.4.1 Proxys für Spring Security-Filter erstellen...253 7.4.2 Sicherheitskontexte behandeln...259 7.4.3 Aufforderung zur Benutzeranmeldung...260 7.4.4 Sicherheits-Exceptions behandeln...265 7.4.5 Websicherheit erzwingen...266 7.4.6 Sicheren Kanal schützen...268 7.5 Sicherheit für die Darstellungsebene...270 7.5.1 Bedingtes Inhalts-Rendering...271 7.5.2 Authentifizierungsdaten anzeigen...272 7.6 Methodenaufrufe schützen...273 7.6.1 Sicherheitsaspekt erstellen...273 7.6.2 Methoden mit Metadaten absichern...275 7.7 Zusammenfassung...276 8 Spring und POJO-basierte Remote-Services... 277 8.1 Das Spring-Remoting im Überblick...278 8.2 Mit RMI arbeiten...281 8.2.1 RMI-Services verschalten...281 8.2.2 RMI-Services exportieren...283 8.3 Remoting mit Hessian und Burlap...287 8.3.1 Zugriff auf Hessian-/Burlap-Services...287 8.3.2 Bean-Funktionalitäten mit Hessian und Burlap verfügbar machen...289 8.4 Springs HTTP-Invoker verwenden...293 8.4.1 Zugriff auf Services via HTTP...293 8.4.2 Beans als HTTP-Services verfügbar machen...294 8.5 Spring und Webservices...296 8.5.1 Beans als Webservices mit XFire exportieren...296 X
8.5.2 Webservices mit JSR-181-Annotationen erstellen... 300 8.5.3 Webservices weiterverarbeiten... 303 8.5.4 Proxys für Webservices mit einem XFire-Client erstellen... 309 8.6 Zusammenfassung... 310 9 Erstellen von Contract First Web Services in Spring... 311 9.1 Einführung in Spring Web Services... 313 9.2 Den Kontrakt (zuerst!) definieren... 315 9.2.1 Erstellen von Beispiel-XML-Nachrichten... 315 9.3 Umgang mit Nachrichten mit Dienstendpunkten... 320 9.3.1 Erstellen eines JDOM-basierten Nachricht-Endpunkts... 321 9.3.2 Marshalling von Nachrichten-Payloads... 323 9.4 Die gemeinsame Verschaltung... 326 9.4.1 Spring-WS im Gesamtzusammenhang... 327 9.4.2 9.4.3 Nachrichten auf Endpunkte mappen... 328 Verschalten des Dienstendpunkts... 329 9.4.4 Einen Nachrichten-Marshaller konfigurieren... 329 9.4.5 Umgang mit Endpunkt-Exceptions... 332 9.4.6 Die Arbeit mit WSDL-Dateien... 333 9.4.7 Den Dienst deployen... 337 9.5 Verarbeitung von Spring-WS-Webservices... 337 9.5.1 Die Arbeit mit Webservice-Templates... 338 9.5.2 Die Arbeit mit WebServiceGatewaySupport... 344 9.6 Zusammenfassung... 345 10 Messaging in Spring... 347 10.1 Kurze Einführung in JMS... 348 10.1.1 Die Architektur von JMS... 349 10.1.2 Die Vorteile von JMS... 352 10.1.3 Einrichtung von ActiveMQ in Spring... 354 10.2 JMS im Einsatz mit Spring... 355 10.2.1 Umgang mit unübersichtlichem JMS-Code... 355 10.2.2 Die Arbeit mit JMS-Templates... 357 10.2.3 Nachrichten konvertieren... 363 10.2.4 Die Gateway-Support-Klassen von Spring in JMS... 366 10.3 Erstellung nachrichtengetriebener POJOs... 367 10.3.1 Erstellen eines Message-Listeners... 368 10.3.2 Das Schreiben reiner POJO-MDBs... 371 10.4 Die Arbeit mit nachrichtenbasierten RPCs... 375 10.4.1 Einführung in Lingo... 376 10.4.2 Den Service exportieren... 377 10.4.3 JMS und Proxy... 378 10.5 Zusammenfassung... 380 XI
11 Spring und Enterprise JavaBean... 381 11.1 Verschaltung von EJBs in Spring...382 11.1.1 Session-Beans und Proxys (EJB 2.x)...383 11.1.2 Verschalten von EJBs mit Spring-Beans...387 11.2 Entwicklung von Spring-fähigen EJBs (EJB 2.x)...388 11.3 Spring und EJB 3...390 11.3.1 Pitchfork...391 11.3.2 Der Start mit Pitchfork...392 11.3.3 Ressourcen durch Annotationen injizieren...393 11.3.4 Deklaration von Interceptors über Annotationen...394 11.4 Zusammenfassung...395 12 Zugriff auf Enterprise-Services... 397 12.1 Objekte von JNDI verschalten...398 12.1.1 Die Arbeit mit konventionellem JNDI...399 12.1.2 Injektion von JNDI-Objekten...401 12.1.3 Verschalten von JNDI-Objekten in Spring 2...404 12.2 Der E-Mail-Versand...405 12.2.1 Konfiguration eines Mail-Senders...405 12.2.2 Konstruktion der E-Mail...407 12.3 Zeitplanung für Tasks...410 12.3.1 Zeitplanung mit dem Timer von Java...410 12.3.2 Der Quartz Scheduler...413 12.3.3 Methoden bei einem Zeitplan aufrufen...417 12.4 Verwalten von Spring-Beans mit JMX...419 12.4.1 Spring-Beans als MBeans exportieren...419 12.4.2 Remoting von MBeans...428 12.4.3 Benachrichtigungen...432 12.5 Zusammenfassung...434 Teil 3: Spring auf der Client-Seite... 437 13 Umgang mit Webanfragen... 439 13.1 Der Start mit Spring MVC...440 13.1.1 Ein Tag im Leben einer Anfrage...440 13.1.2 Die Konfiguration von DispatcherServlet...442 13.1.3 Spring MVC im Überblick...444 13.2 Anfragen den Controllern zuordnen...450 13.2.1 Die Arbeit mit SimpleUrlHandlerMapping...451 13.2.2 Die Arbeit mit ControllerClassNameHandlerMapping...452 13.2.3 Zuordnung von Controllern über Metadaten...453 13.2.4 Die Arbeit mit mehreren Handler-Mappings...453 13.3 Die Bearbeitung von Anfragen durch Controller...454 13.3.1 Verarbeitung von Befehlen...457 13.3.2 Formulareingaben verarbeiten...459 13.3.3 Verarbeitung komplexer Formulare mit Assistenten...466 XII
13.3.4 Die Arbeit mit Throwaway-Controllern... 473 13.4 Umgang mit Exceptions... 476 13.5 Zusammenfassung... 476 14 Darstellen von Web-Views... 479 14.1 Auflösung von Views... 480 14.1.1 Die Arbeit mit Template-Views... 481 14.1.2 Auflösen von View-Beans... 483 14.1.3 Wahl eines View-Resolvers... 485 14.2 Die Arbeit mit JSP-Templates... 487 14.2.1 Binding von Formulardaten... 487 14.2.2 Darstellung von ausgelagerten Nachrichten... 489 14.2.3 Fehlerausgabe... 491 14.3 Seitenlayout mit Tiles... 493 14.3.1 Tiles-Views... 493 14.3.2 Erstellen von Controllern in Tiles... 497 14.4 Alternativen zu JSP... 499 14.4.1 Die Arbeit mit Velocity-Templates... 499 14.4.2 Die Arbeit mit FreeMarker... 505 14.5 Generierung von Nicht-HTML-Ausgaben... 510 14.5.1 Erstellung von Excel-Tabellen... 510 14.5.2 Generierung von PDF-Dokumenten... 513 14.5.3 Entwicklung eigener Views... 515 14.6 Zusammenfassung... 518 15 Die Arbeit mit Spring Web Flow... 519 15.1 Der Einstieg bei Spring Web Flow... 521 15.1.1 Die Arbeit mit Spring Web Flow... 523 15.1.2 Wesentliche Grundzüge von Spring Web Flow... 526 15.1.3 Erstellen eines Ablaufs... 528 15.2 Die Grundlagen für den Ablauf... 529 15.2.1 Ablaufvariablen... 529 15.2.2 Start- und Endzustände... 531 15.2.3 Die Kundeninformationen... 532 15.2.4 Die Pizzabestellung... 538 15.2.5 Abschließen der Bestellung... 541 15.2.6 Einige Feinarbeiten... 543 15.3 Fortgeschrittene Webflow-Techniken... 546 15.3.1 Die Arbeit mit Entscheidungszuständen... 547 15.3.2 Extrahierung von Unterabläufen und Unterzuständen... 549 15.4 Spring Web Flow mit anderen Frameworks integrieren... 553 15.4.1 Jakarta Struts... 553 15.4.2 JavaServer Faces... 554 15.5 Zusammenfassung... 555 XIII
16 Integration mit anderen Webframeworks... 557 16.1 Die gemeinsame Nutzung von Spring und Struts...558 16.1.1 Registrieren des Spring-Plug-ins bei Struts...559 16.1.2 Das Schreiben von Spring-fähigen Struts-Actions...560 16.1.3 Delegation an in Spring konfigurierte Actions...562 16.1.4 Was ist mit Struts 2?...564 16.2 Die Arbeit mit Spring und WebWork 2/Struts 2...565 16.3 Integration von Spring und Tapestry...568 16.3.1 Integration von Spring und Tapestry 3...569 16.3.2 Integration von Spring und Tapestry 3...572 16.4 Spring mit JSF ein Gesicht verleihen...573 16.4.1 Auflösen von über JSF verwalteten Eigenschaften...574 16.4.2 Auflösung von Spring-Beans...576 16.4.3 Spring-Beans mit JSF-Seiten verwenden...577 16.4.4 Der Anwendungskontext in JSF...578 16.5 Durch DWR Ajax mit Spring-Anwendungen einsetzen...578 16.5.1 Direct Web Remoting...579 16.5.2 Zugriff mit DWR auf in Spring verwaltete Beans...587 16.6 Zusammenfassung...592 A Das Setup von Spring... 593 A.1 Download von Spring...593 A.1.1 Die Spring-Distribution...594 A.1.2 Erstellen des Klassenpfads...595 A.2 Spring-Abhängigkeit in Maven 2 konfigurieren...596 A.3 Spring und Ant...599 A.4 Spring und Log4j...600 B Tests mit (und ohne) Spring... 603 B.1 Einführung in das Testverfahren...603 B.1.1 Die unterschiedlichen Testverfahren...604 B.1.2 Die Arbeit mit JUnit...605 B.1.3 Die Rolle von Spring bei Tests...608 B.2 Unit-Tests für Spring MVC Controller...609 B.2.1 Mock-Objekte...610 B.2.2 Testen der Inhalte von ModelAndView...613 B.3 Integrationstest mit Spring...615 B.3.1 Testen verschalteter Objekte...616 B.3.2 Integrationstests von transaktionalen Objekten...619 B.3.3 Tests mit der Datenbank...621 B.3.4 Tests in JUnit 4 mit gienah...624 B.4 Zusammenfassung...626 Register... 627 XIV