Einsatz

Werbung
Spring 3
Java-Framework
Autor
Stephan Metzler
Version 2.1
© 2011
Spring 3 >> Java Framework >>
Nachmittag
Vormittag
Nachmittag
Vormittag
MileStones
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Java Community
Verteilte Systeme
Java EE
Spring Framework
Spring Container
Dependency Injection
Spring AOP
Testen
ORM
Transaktionen
Messaging
Remoting
Spring MVC
Spring Security
Trends
Referenzen
Seite
6
15
18
25
38
48
62
72
81
102
118
126
131
147
155
159
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 2 >> total: 160 Seiten
Spring 3 >> Java Framework >>
A
Java Community
Lerninhalte
Technologie Übersicht
Entwicklungtools
Paradigmatrends
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 3 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
1
Java Plattform
Die Java Plattform ist in drei Editionen aufgeteilt
JME
JSE
Micro Edition
Standard Edition
JEE
Enterprise Edition
- Umgebung
- Inhalt
- Definition
- robust
- flexible
- JRE
- APIs
- VM
- Standard (Framework)
- Multi-User
- Multi-Tier
- Enterprise Appl.
- Ziel-Applikationen
- embedded devices
- Mobil-Telefone
- PDAs
- Inhalt
- VM
- Standard Java APIs
- Kommunikationsprozesse
- JDK
- JRE
- Compiler
- Debugger
Basis für JEE
- Inhalt
- Dienstleistungen
- Zugriff
- transparente Lösungen
- Verhalten
1.1
OOA / OOD
hilfreiche und wichtige Neuerungen im Java-Standard (seit JDK 1.5)
- Annotations (Metadaten im Source)
- Generics (parametrischer Polymorphie)
Tools im Umgang mit JEE Technologien
- Maven (Build-Management-Tool der Apache Software Foundation)
- Log4J
- Junit
- Mock
state of the Art Implementierung ► siehe: Trends
- Software-Paradigmen
- Agil Don't Repeat Yourself
- DSL (Domain Specific Language)
- NoSQL
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 4 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
1.1.1
Annotationen
wiki
Annotation bedeutet "Anmerkung",
"Anmerkung", "Beifügung", "Hinzufügung". In diesem Sinn haben
Annotationen bei Stichworten,
Stichworten, Begriffsklärungen oder ausführlichen Texten den
Charakter der Erklärung beziehungsweise Ergänzung.
In der Softwareentwicklung dienen Annotationen dazu, Metadaten in den Quelltext
eines Programms einzubinden. Diese haben keine direkte Auswirkung auf die
Übersetzung des Quelltextes, bieten aber zusätzliche Möglichkeiten im Vergleich zu
einfachen Kommentaren.
Kommentaren.
Eigenschaften
Metadaten direkt im Sourcecode (zentral)
XML- oder Property-Dateien entfallen (mehrere Dateien sein z.T. umständlich)
werden von Codegenerierungstools ausgelesen (Controlle bei der Entwicklung)
werden zur Laufzeit per Reflection abgefragt (zur dynamischen Verwendung in
Frameworks)
- Zuordnung zum Sourcecode ersichtlich (als Entwickler Vorteil)
-
Verwendung von Annotations
- Annotations werden im Sourcecode vor dem zu markierenden Element eingefügt
- @ als Kennzeichnung vorangestellt (Leerzeichen sind erlaubt)
- Parameter als Name-Wert-Paar in Klammern an den Annotationsnamen angehängt
@MyAnnotation(parameter1 = "hello", parameter2 = "spring")
-
Reihenfolge der Parameter spielt keine Rolle
hat die Annotation nur einen Parameter, kann der Name weggelassen werden
bei parameterlosen Annotations ist die Angabe der Klammern optional
Annotations können sich auf folgende Java-Elemente beziehen:
- Packages, Klassen, Interfaces, Enumerations, Methoden, Variablen, Methodenparameter
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 5 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
Annotations in der Java JSE 5.0
- definiert sieben Annotations
- Standard Annotation (normale Verwendung beim Programmieren)
- Meta Annotation (Definition neuer Annotationstypen)
Standard Annotations
- @Deprecated
- kennzeichnet Methoden und Klassen, die nicht mehr verwendet werden sollen
- @Override
- der Compiler stellt sicher, dass die Methode der Basisklasse überschrieben wird
- @SuppressWarnings
- unterdrückt Compilerwarnungen. Warnungen werden als Parameter angegeben
Beispiel @Deprecated / @Override
public class HelloWorld {
@Deprecated
public String sayHello() {
return "Hello World";
}
@Override
public String toString() {
return "Hello World";
}
}
- sayHello() ist veraltet und erzeugt Compilerwarnung
- toString() mit @Override stellt sicher, dass toString() aus Object überschrieben wird
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 6 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
Meta Annotations
- @Documented
- zur Erzeugung der Dokumentation bei Javadoc
- @Inherited
- Annotation-Typ wird vererbt, auch rekursiv, falls keine Annotation in der aktuellen Klasse gefunden wird.
- @Retention
- Definiert wie lange die Annotation verfügbar ist
- SOURCE
- nur bis zur Compilerzeit zur Verfügung
- CLASS (DEFAULT)
- werden in den Class-Dateien abgespeichert, aber nicht von der VM geladen
- RUNTIME
- werden in der Class-Datei abgelegt und von der VM geladen und stehen somit zur Auswertung
per Reflection zur Verfügung
- @Target
- definiert Elemente (Klasse, Methode, Parameter etc.) denen eine Annotation zugeordnet werden kann
Beispiel selbst definierter Annotation
public enum Datentyp {TEXT, NUMMER, DATUM }
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Datenfeld {
String bezeichnung() default "";
Datentyp datentyp() default Datentyp.TEXT;
}
- @Retention(RetentionPolicy.RUNTIME) definiert die Verfügbarkeit
- RUNTIME : Auswertung zur Laufzeit
- @Target({ElementType.FIELD}) definiert wo die Annotation eingesetzt werden kann
- FIELD : für Attribute
- @interface definiert das annotierte API Element "Datenfeld"
- Parameter : Bezeichnung und Datentyp (sind optional und mit Default-Werten)
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 7 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
Anwendung:
Anwendung: Klasse Person annotiert Attribute als Datenfelder
public class Person implements java.io.Serializable {
@Datenfeld(bezeichnung = "Nummer", datentyp = Datentyp.NUMMER)
private int nr;
@Datenfeld(bezeichnung = "Name", datentyp = Datentyp.TEXT)
private String name;
@Datenfeld
private String beschreibung;
}
Auslesen der Annotationen
Person p = new Person();
Field[] fields = p.getClass().getDeclaredFields();
for (Field field : fields) {
Datenfeld datenfeld = field.getAnnotation(Datenfeld.class);
...
1.1.2
Generics
wiki
In der Informatik sind Generische Typen Datentypen mit der Möglichkeit
Möglichkeit zur Angabe
von Typparametern. Man spricht auch von parametrischer Polymorphie.
Polymorphie.
Ein generischer Typ erlaubt es, Datentypen zu erzeugen, die von den zu Grunde
liegenden Typen abstrahieren. So würden eine Liste von Zahlen, eine Liste von
Zeichen und eine
eine Liste von Datumsangaben im Grunde auf dieselbe Weise
programmiert werden. Die Algorithmen zum Einfügen, Suchen und Löschen würden
stets gleich ablaufen. Es ist daher wünschenswert, die Implementierung der Liste
unabhängig von diesen Typen vorzunehmen
Eigenschaften
-
erlauben die Abstraktion von Typen
erlaubt Wiederverwendbarkeit von Funktionalitäten
defineren generische Klassen und Methoden, unabhängig von einem konkreten Typ
definieren parametrische Polymorphie
Generics verbessert die Lesbarkeit und hilft
hilft durch die erhöhte Typsicherheit
die Zuverlässigkeit des Codes zu erhöhen.
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 8 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
normale Collections
List v = new Vector();
v.add(new Double(1.0));
Double d = (Double)v.get(0);
- Cast auf Double ist notwendig, denn der Rückgabewert von get(...) ist Objekt
- erlaubt inkompatible Typen in die Liste einzuführen
generische
generische Collections
List<Double> v = new Vector<Double>();
v.add(new Double(1.0));
Double d = v.get(0);
- v ist eine Liste von (nur) Double
- Typ in spitzen Klammern definiert den konkreten Typparameter
- Verwendung wird durch Compiler sichergestellt und zur Compilezeit erkannt
- Casts entfallen, da Rückgabewert von get(...) nur Double ist
- mehrere Typparameter werden durch Komma getrennt (z. B. Hashtable<Long, String>)
Wildcards und Bounds
- unabhängiger Code
- Implementierung von Such- oder Sortieralgorithmen
- Wildcardzeichen ist ?
- Vector<?> steht für einen Vector mit beliebigem Inhalt
- Bounds als Angabe von Schranken
- extends limitiert auf den angegebenen oder abgeleiteten Typ
- super limitiert auf den angegebenen oder vererbten Typ
Beispiel parametriesierter Polymorphie
Vector<?> v1;
Vector<String> v2 = new Vector<String>();
v1 = v2;
// nur String
List<? extends Number> aList;
// Number oder Subtyp
List<? super String> anotherList // String oder Supertyp
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 9 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
generische Typen
- Generics sind nicht auf die Verwendung bestehender Klassen beschränkt
- eigene generische Typen können definiert werden
Definition der generischen Klasse MyGeneric
- Enthält zwei Typparameter (T und U)
- die Typparameter können wie normale Typen bei der Definition der Klasse verwendet werden
public class MyGeneric<T, U> {
private T key;
private U value;
public MyGeneric(T key, U value) {
this.key = key;
this.value = value;
}
public T getKey() {
return key;
}
public U getValue() {
return value;
}
}
Generische Methoden
- Definition von generischen Methoden
- Definition der generischen Methode sayHello(...), die zwei Typparameter enthält
public class GenericMethod {
public static <E, T> void sayHello(E pre, T post) {
System.out.println(pre.toString() + " hello "
+ post.toString());
}
public static void main(String[] args) {
sayHello("generic", new StringBuffer("world"));
}
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 10 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
1.1.3
Maven
wiki
Maven ist ein BuildBuild-ManagementManagement-Tool der Apache Software Foundation und basiert
auf Java.
Java. Mit ihm kann man insbesondere JavaJava-Programme standardisiert erstellen
und verwalten.
Eigenscha
Eigenschaften
- bildet "Convention over Configuration" für gesamten Zyklus der Softwareerstellung ab
- automatisiert die Prozesse der Entwicklung
-
Kompilieren
Testen
Packen
Deployen
- definiert vorgegebene Standards
- braucht wenige Konfigurationseinstellungen
- vereinfacht Aufgaben des Build-Managements
- bildet den Lebenszyklus eines Softwareprojekts ab
Lebenszyklus - Softwareentwicklung (mit Maven) folgt einem Zyklus:
- validate (Validieren)
- prüft ob die Projektstruktur gültig und vollständig ist
- compile (Kompilieren)
- kompiliert den Quellcode
- test (Testen)
- testet den kompilierten Code mit einem passenden Testframework (z.B. JUnit)
- package (Verpacken)
- der kompilierte Code wird mit anderen nichtkompilierbaren Dateien zur Weitergabe verpackt (z.B. JAR)
- integration-test (Test der Integrationsmöglichkeit)
- Softwarepaket wird auf eine Umgebung (z.B. Server) geladen und seine Funktionsfähigkeit geprüft
- verify (Gültigkeitsprüfung des Software-Pakets)
- prüfen ob das Softwarepaket eine gültige Struktur und bestimmte Qualitätskriterien erfüllt
- install (Installieren im lokalen Maven-Repository)
- installiert das Softwarepaket in dem lokalen Maven-Repository (z.B. für modulare Projekte)
- deploy (Installieren im entfernten Maven-Repository)
- installiert das Softwarepaket auf einem entfernten Maven-Repository (Wiederverwendbarkeit)
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 11 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
Konfigurationsdatei http://maven.apache.org/pom.html
- als XML-Datei mit dem Dateinamen pom.xml (für Project Object Model)
- enthält alle Informationen zum Softwareprojekt
- standardisiertes Format
<?xml version="1.0" encoding="UTF-8"?>
- src
- alle Eingabedateien
- target
- alle erzeugten Dateien
<project xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="
http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>spring-utility</artifactId>
<version>1.0.0.CI-SNAPSHOT</version>
<name>Spring Utility</name>
<url>http://www.springframework.org</url>
<properties>
<spring.framework.version>
3.0.2.RELEASE
</spring.framework.version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>
StandardStandard-Verzeichnisstruktur
- vereinfacht die zentrale Konfigurationsdatei pom.xml
- Softwareprojekt soll sich an folgende Struktur halten
- src/main
- Eingabedateien für Erstellung des eigentlichen Produkts
- src/main/java
- Java-Quelltext
- src/main/resources
- Dateien für die Übersetzung oder zur Laufzeit
z.B. Properties-Dateien
- src/test
- Eingabedateien für automatisierte Testläufe
- src/test/java
- JUnit-Testfälle für automatisierte Tests
- target/classes
- kompilierte Java-Klassen
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 12 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
Auflösung von Abhängigkeiten
als zentrale Repositories
- in der pom.xml werden Softwareabhängigkeiten angegeben
- diese Abhängigkeiten werden aufgelöst
- Maven ermittelt ob die benötigten Dateien in einem lokalen Verzeichnis bereits vorhanden sind
- oder Maven versucht sich mit einem konfigurierten Maven-Repository im Intranet zu verbinden
- oder Maven versucht sich mit einem konfigurierten Maven-Repository im Internet zu verbinden
- Abhängigkeiten werden in das lokale Repository kopiert
- Bekannte öffentliche Maven-Repositories http://mvnrepository.com/
-
Apache
Ibiblio
Codehouse
Java.Net
- Firmenweite Maven-Repositories stellen Bibliotheken und Frameworks zur Verfügung
- Archiva, Artifactory, Proximity
- Codehaus Maven Proxy
- Dead Simple Maven Proxy
1.1.4
-
Log4J
populäre JAVA Logging-API http://logging.apache.org/log4j
Vererbung von Loggern
Logger Hierarchien erlauben feingranulare Kontrolle über Logausgaben
Log-Anweisungen lassen sich durch Konfigurationsdateien ein- und ausschalten
Komponenten
- Loggers
- Layouts
- Appenders
Loggers
- benannte Entitäten (Case sensitive) und
folgen einer hierarchischen Namenskonvention
- Root-Logger (z.B. org) ist oberste Instanz
- org.apache.log4j
- Einem Logger kann ein Level zugeordnet werden
- DEBUG < INFO < WARN < ERROR < FATAL
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 13 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
Layouts
- erlauben das Formatieren der Loggermeldungen mit Pattern
org.apache.log4j
Pattern Zweck
c
Category: Kategorie = Name org.apache
C
Class = Klassennamen
d
Date. Beispiel: %d{HH:mm:ss,SSS}
F
Filename
l
Location. Aufrufende Methode, Quelle, Dateiname und Zeilennummer
L
Line number
m
Meldung selbst
M
Methodennamen
n
Line-Separator (Plattformabhängig)
p
Priority: INFO, WARN, ERROR etc.
r
Anzahl der Millisekunden seit dem Start der VM
Appenders
- Destinationen für Logger Meldungen
-
Konsolen
Dateien (klassische Logger-Dateien)
GUI-Komponenten
Remote Socket-Server (Stichwort zentrale Überwachung)
JMS (Java Message Server)
NT Event Logger
Unix Syslog Deamon
Appender Additivity
Logger
Appender Target
Vererbte Appenders
root
org
org.apache
org.apache.log4j
A1
B1, B2
none
C1
org und root
org und root
org.apache.log4j, org und root
A1
A1, B1, B2
A1, B1, B2
A1, B1, B2, C1
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 14 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
Konfiguration
Konfiguration
- mittels XML oder mit Properties-Dateien
# der Root-Logger hat den Level DEBUG
log4j.rootLogger=DEBUG, stdout, file
# Appender mit der Destionation Konsole
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# Layout Für diesen Appender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Datum im ISO-Format ISO-8601 anzeigen
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
# allen Klassen des Packages org.springframework den Level [INFO | DEBUG | ERROR] zuweisen
log4j.logger.org.springframework=ERROR
# Konfiguration der Log-Datei
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=../log4j.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%p %t %c - %m%n
log4j.appender.file.MaxFileSize=100KB
# Eine Backup-Datei behalten
log4j.appender.file.MaxBackupIndex=1
# weitere Categorien
log4j.category.org.apache.activemq=ERROR
log4j.category.org.springframework.batch=DEBUG
log4j.category.org.springframework.transaction=INFO
# Persistenz
log4j.category.org.hibernate.SQL=DEBUG
for debugging datasource initialization
log4j.category.test.jdbc=DEBUG
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 15 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java Plattform
B
Verteilte Systeme
Lerninhalte
Technologien
Corba
DCOM
.NET
EJB
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 16 >> total: 160 Seiten
Spring 3 >> Java Framework >> Verteilte Systeme
2
Verteilte Systeme
- mehreren Prozessen
- kommunizieren mittels Nachrichtenaustausch
Eigenschaften
- gemeinsame Nutzung von Ressourcen
- zuverlässige und konstante Zugriffszeit
- Offenheit
-
Client Server Architektur
Erweiterbarkeit des Systems (Hardware, Software)
Standardisierung von Schnittstellen
Interprozesskommunikation
heterogene HW- und SW- Komponenten
- Skalierbarkeit
- ohne Änderungen der System- oder Anwendungssoftware
- Fehlertoleranz
- Hardwareredundanz
- Softwareredundanz
Peer-to-Peer Architektur
2.1
Technologien für Verteilte Systeme
CORBA
► Common Object Request Broker Architecture
- plattform- und sprachunabhängig
- nur "basic distribution"
DCOM
► Distributed Component Object Model
Dienste zur Kommunikation zwischen Prozessen
- Microsoft
- CORBA-DCOM Bridge
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 17 >> total: 160 Seiten
Spring 3 >> Java Framework >> Verteilte Systeme
.NET (Microsoft) http://de.wiki.org/wiki/.NET
-
sprach- und (plattform-) unabhängig
löst Component Object Model ab
fokussiert auf Client (Services)
auch PDA (Personal Digital Assistant)
seit Januar 2008 OpenSouce
CLR ist die Laufzeitumgebung
- CLR = Common Language Runtime
- Interpreter für den standardisierten
Zwischencode
- CLI ist der Zwischencode
- CLI = Common Intermediate Language
EJB (Enterprise Java Beans) http://de.wiki.org/wiki/Enterprise_JavaBeans
-
nur JAVA http://java.sun.com/javaee
entwickelt für Geschäftsprozesse
intgegriete Verbindungslogik
standardisierte Komponenten
vereinfachte Entwicklung
- Sicherheit
- Transaktionen
- Kommunikation
- synchron
- asynchron
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 18 >> total: 160 Seiten
Spring 3 >> Java Framework >> Verteilte Systeme
C
Java EE
Lerninhalte
Spezifikation
Einsatzgebiete
Komponenten
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 19 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java EE Plattform
3
Java EE Plattform
http://java.sun.com/javaee/5/docs/tutorial/doc/
Spezifikation
- JEE ist die Spezifikation einer Softwarearchitektur
- JEE bezeichnet ein Applikationsframework, ausgelegt auf
- Performance
- Skalierbarkeit
- Plattformunabhängigkeit
Eigenschaften
- sauber implementierte Trennung
zwischen Tiers
- dadurch weitgehende
Unabhängigkeit
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 20 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java EE Plattform
3.1
wiki
Application Server
Ein Anwendungsserver ist ein Server in einem
Computernetzwerk,
Computernetzwerk, auf dem AnwendungsAnwendungsprogramme ausgeführt werden.
Im engeren Sinne bezeichnet der Begriff eine
Software,
Software, die spezielle Dienste
Dienste zur Verfügung
stellt, wie beispielsweise Transaktionen,
Transaktionen,
Authentifizierung
Authentifizierung oder den Zugriff auf
Verzeichnisdienste und Datenbanken
über definierte Schnittstellen.
Schnittstellen.
JEE Anwendungserver beinhaltet
- Components
- Applets, Servlets, Enterprise Java Beans
- Containers
- Web Browsers, Servlet Engines, EJB Containers
- Resources
- SQL Datenquellen, Nachrichtensysteme, Mailsysteme
3.2
History
History der Java Enterprise Edition
http://de.wikipedia.org/wiki/Java_Platform,_Enterprise_Edition
Robustheit
J2EE 1.3
J2EE 1.2
JPE Project
Java
Plattform for
the Enterprise
1998
Servlet /JSP
EJB 1.0
JMS 1.1
JTA 1.0
JAAS 1.0
JNDI
RMI/IIOP
1999
EJB 2.0
2001
Web Services
J2EE 1.4
EJB 2.1
JSS 2.4
JSP 2.0
WS 1.0
JavaMail 1.2
JAXP 1.2
JCA 1.5
2003
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 21 >> total: 160 Seiten
SOA
Java EE 5
EJB 3.0
JPA 1.0
JSS 2.5
JSP 2.1
JSF 1.2
WS 1.2
JavaMail 1.4
JAXB 2.0
JAXP 1.3
JAX-WS 2.0
StAX 1.0
JSTL 1.2
Java EE 6
2006
2010
EJB 3.1
JPA 2.0
JSS 3.0
JSF 2.0
Bean
Validation
Spring 3 >> Java Framework >> Java EE Plattform
3.3
Features
- neue XML/Web Services
-
JAX-B (JSR-222) - Java Architecture for XML Binding
JAX-WS (JSR-224) - Java API for XML - Web Services
StAX (JSR-173) - Streaming API for XML
Web Services Metadata (JSR-181)
- neue Web Technologien
- JSP Standard Tag Library (JSR-52)
- Java Server Faces (JSR-252)
- neue EoD (Ease Of Development = Entwicklungserleichterung)
- EJB 3.0 und Java Persistence API (JSR-220)
- Common Annotations (JSR-250)
- Security Änderungen
- Gleichsetzung der Security Permissions von Web und EJBContainer
Deployment Deskriptoren
wiki
Ein Deployment Descriptor (frei übersetzt "Einsatzbeschreibung")
"Einsatzbeschreibung") ist eine
Konfigurationsdatei im Format XML.
XML. Im Umfeld der Java Platform, Enterprise Edition,
Edition,
Bereitstellungsprozess
prozess (englisch
beschreibt diese Konfigurationsdatei den spezifischen Bereitstellungs
deployment)
deployment) und dazu benötigte Informationen.
Informationen.
-
sind eine der Stärken von J2EE
Grundlage: J2EE Rollenverständnis: Comp.Developer, Assembler, Deployer
Idee nachträglich Settings/Verhalten anpassen zu können
jedoch grössere Komplexität
nur durch Tools (IDEs, Xdoclet) beherrschbar
Migrationshindernis
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 22 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java EE Plattform
3.4
Einsatzgebiete
In den folgenden Gebieten finden JEE Applikationen ihren Schwerpunkt:
-
Datenbankzugriff
dynamische Internetseiten
Enterprise JavaBeans
Middle-Tier Server
plattformenabhängige Kommunikation
Sicherheit
Trennung der Anwenderschwerpunkte
verteilte Systeme
Web-Server-Einsatz
3.5
Architektur
Funktionelle Einheiten werden als Komponenten bezeichnet und zu einer KomponentenArchitektur zusammengefasst.
Dabei dominieren die folgenden "Core Technologies":
- JNDI (Java Naming and Directory Interface)
- Zugriff auf "naming" und "directory" Systeme wie LDAP, DNS, etc.
- JTA (Java Transaktion API)
- Zugriff auf Transaction Systeme wie BEA Tuxedo, etc.
- JDBC (Java DataBase Connectivity)
ORACLE
- Zugriff zu relationalen Datenbanken
- JMS (Java Messaging Service )
- Zugriff zu Message Orientated
Middleware, z.B. iBus ,IBM MQSeries
DB2
JDBC
BEATuxedo
JTA
JEE
JMS
IBM MQSeries
iBus
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 23 >> total: 160 Seiten
JNDI
LDAP
DNS
COS
Spring 3 >> Java Framework >> Java EE Plattform
3.6
wiki
Konventionen
Eine Konvention (lat.
(lat. conventio „Übereinkunft, Zusammenkunft“) ist eine nicht formal
festgeschriebene Regel,
Regel, die von einer Gruppe von Menschen aufgrund eines Konsens
eingehalten wird.
- Namenskonventionen mit JSR 220 nicht mehr so dominant
- orientieren sich am Namensmodell von SUN™
Ansatz basierend auf dem HelloWorld
HelloWorld EJB
Item
Syntax
Enterprise Bean Name (DD)
<name>Bean
EJB JAR Display Name (DD)
<name>JAR
Enterprise Bean Class
<name>Bean
Business
<name>
Business / Remote Interface
Local Business / Remote Interface
<name>Local
Abstract Schema (DD)
<name>
Beispiel
HelloWorldBean
HelloWorldJAR
HelloWorldBean
HelloWorld
HelloWorldLocal
HelloWorld
3.7
wiki
Komponenten
Eine SoftwareSoftware-Komponente ist ein SoftwareSoftware-Element, das konform zu einem
Komponentenmodell ist
ist und gemäss einem CompositionComposition-Standard ohne Änderungen
mit anderen Komponenten verknüpft und ausgeführt werden kann.
also eine funktionierende Software Einheit
-
wird über einen JEE-Server verschiedenen Clients zur Verfügung gestellt
ist Bestandteil einer JEE-Anwendung
als *.ear Datei (e
enterprise archive)
gepackt
ar
bestehend aus folgenden (optionalen) Komponenten
- Enterprise Beans
- eine oder mehrere Enterprise Beans in einer *.jar Datei (java archive)
- WEB-Anwendungen
- HTML-Seiten, Servlets, JSP, gif- und jpg-Bilder in einer *.war Datei (web application archive)
- Client-Anwendungen
- Stand-Alone Java Applikation in einer *.jar Datei (java archive)
- Deployment Descriptors
- XML-Dokumente zur Integrationsbeschreibung
(sind optionale Bestandteile jeder EAR Komponente)
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 24 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java EE Plattform
3.8
Enterprise Archive
- folgt standardisierter Struktur
- ermöglicht dem Applikationsserver das Entpacken der Komponenten
- erlaubt das Deployen der JEE Applikation
3.9
Verteilte Multi-Tier Applikationen
- das Verteilen der Applikation definiert der "separation of concern" Aspekt der OOA
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 25 >> total: 160 Seiten
Spring 3 >> Java Framework >> Java EE Plattform
D
Spring Framework
Lerninhalte
Motivation
Core Technologien
Module
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 26 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Framework
4
Spring Framework
- Open-Source-Framework (Rod Johnson, Buch: J2EE Design and Development)
- Entwicklung von Unternehmensanwendungen soll weniger komplex werden
- JavaBeans als Serverkomponenten ohne Server vs. EJBs
LightweightLightweight-Container/Container/-Framework mit Dependency Injection
Injection und
Aspektorientierung als vollwertiger Java EE / J2EEJ2EE-Applikationstack, der
durch Qualität, Effizienz und Einfachheit glänzt.
http://www.springsource.org/
We aim that:
- Spring should be a pleasure to use
- Your application code should not depend on Spring APIs
- Spring should not compete with good existing solutions, but should foster integration. (For
example, JDO, Toplink, and Hibernate are great O/R mapping solutions. We don't need to
develop another one.)
4.1
neue Features in Spring 3
- SpEL Spring Expression Language
- Ausdrücke werden zur Laufzeit ausgewertet
- ermöglicht dynamische Elemente im System
- als XML-Konfiguration oder innerhalb von Annotationen
- komfortabler Umgang mit Annotationen
- mit Annotationen konfigurieren, ohne die Implementierungsklassen anzupassen
- Meta-Annotationen
- eigene Annotations definieren
- an zentraler Stelle die Annotationen zusammenstellen und diese in eigenen Klassen verwenden
- REST-Unterstützung (Representational State Transfer) im MVC-Framework
- Softwarearchitekturstil für verteilte Hypermedia-Informationssysteme
- Ressourcen werden mit eigenen URI angesprochen
- Spring3 erweitert das enthaltene MVC-Framework um REST-Fähigkeiten
- Konfiguration erfolgt mit Annotationen
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 27 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Framework
4.2
Motivation
Bereiche zu versorgen, die von anderen Frameworks nicht erreicht werden:
- Integration in eine umfassende Architektur kann zu hohem Aufwand führen
- Spring bietet ganzheitliche Lösung an
- leichte Anpassung
- ein Framework soll klare Schichten bieten
- Best-Practices leicht anwenden
- Minimierung des Aufwands für bewährte Techniken mit grösstmöglicher Freiheit beim Design
- keine Abhängigkeit
- IoC und AOP als Schlüsseltechnologien, um Abhängigkeiten zu vermeiden
- konsistente Konfiguration
- mit einheitlichem Stil für alle Schichten der Applikation
- leichte Testbarkeit
- Einsatz von Mock-Objekten klar und geradlinig
- Erweiterbarkeit erlauben
- erweiterbares Framework soll auf Interfaces basieren
4.3
Spring Technologien
Die Spring Core Technologien sind:
- Lightweight Container Framework
- DI / IoC
- AOP
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 28 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Framework
4.4
Lightweight
- Framework ist klein
- erfordert wenig
(Entwickler-)Aufwand
- kleine Prozessorbelastung
- keine Abhängigkeiten von
spezifischen Klassen
- baut auf POJOs auf
Graph
- pom.xml für Beispiele
- Not exactly lightweight
- http://javathreads.de/2009/02/leichtgewichtigkeit-von-jee-oder-spring/
4.5
wiki
Dependency Injection
A
Dependency Injection (DI) ist ein Entwurfsmuster und
dient in einem objektorientierten System dazu, die
Abhängigkeiten
Abhängigkeiten zwischen Komponenten oder Objekten
zu minimieren.
Dependency Injection ist eine Anwendung des
<<creates>>
Prinzips der Inversion of Control (IoC), bezieht sich
aber nur auf die Erzeugung und Initialisierung von Objekten.
Sie kann als Verallgemeinerung der
der Fabrikmethoden verstanden werden.
Die Funktionalität bleibt trotz dieser Kontrollumkehr als
Einfügung enthalten. Dadurch ist es einfach möglich,
Abhängigkeiten zu erkennen.
A
IB
B
IB
- fördert lose Kopplung
- Objekte erhalten ihre Abhängigkeiten passiv
<<injects>>
IoC
-deps
-config
-lifec.
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 29 >> total: 160 Seiten
B
Spring 3 >> Java Framework >> Spring Framework
4.6
wiki
Aspektorientierung
Aspektorientierte Programmierung (AOP) ist ein
Programmierparadigma, eine Methode der ComputerComputerprogrammentwicklung, die anstrebt, verschiedene
logische Aspekte eines Anwendungsprogramms
(kurz Anwendung)
Anwendung) getrennt voneinander zu entwerfen,
entwerfen,
zu entwickeln und zu testen.
Die getrennt entwickelten Aspekte werden dann zur
endgültigen Anwendung zusammengefügt.
A
SECURITY
B
LOGGING
- erlaubt kohäsive (zusammenhängende) Entwicklung
- Separation of Concern
- trennt Business-Logik von Systemservices
A
- Logging
- Auditing
- Transaktionsverwaltung
AOP
SECURITY
B
LOGGING
4.7
Spring Features
Konfiguration und Zusammenstellung komplexer Anwendungen
- deklarativ (in der Regel als XML-Datei)
- zunehmende Konfiguration durch Annotations
- umfassende Infrastrukturfunktionalität
- Transaktionsverwaltung
- Integration in Persistenz-Frameworks
- Java Persistence API http://java.sun.com/javaee/technologies/persistence.jsp
- Hibernate www.hibernate.org
- TopLink http://www.oracle.com/technology/products/ias/toplink/index.html
- iBatis http://ibatis.apache.org/
- etc.
4.7.1
Container
- verantwortlich für Anwendungsobjekte
- Verwaltung
- Konfiguration
- Lebenszyklus
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 30 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Framework
4.8
Spring Module
- Programmbausteine lassen sich in Enterprise-Anwendungen koppeln
- ohne explizite Abhängigkeiten
- definieren konsequente Verwendung von Schnittstellen
Spring Core Container
- zentraler Bestandteil
- lightweight Container
- Inversion of Control
- Dependency Incetion
Verantwortlichkeiten
- Beans / Core
- Objektrelation
- Context
- Objektdefinition
- Expression Language
- Objektmanipulation
4.8.1
Module ► Data Access/Integration
- JDBC
- Layer der JDBC codieren und DBMS Fehler parsen abstrahiert
- ORM
- Layer um populäre O/R-Mapper zu integrieren (JPA, JDO, Hibernate, TopLink, iBatis, etc.)
- OXM
- Layer für Object/XMl Mapping zu integrieren (JAXB, Castor, XMLBeans, JiBX and XStream, etc.)
- JMS
- Layer zur Integration des
asynchronen Kommunikationsmodell
- Transaction
- Layer für deklaratives und
programmatisches Transaktionsmanagement
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 31 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Framework
4.8.2
Module ► Web – MVC / Remoting
- Web
- Layer zur Integration von web-orientierten Features
- multipart file-upload
- servlet listeners
- web-oriented application context
- remoting support
- Web-Servlet
- Layer mit der Spring MVC Implementation
- Web-Struts
- Layer zur Integration von Struts (deprecated)
- Web-Portlet
- Layer zur Portlet Integration
- spiegelt die Funktionen des Web-Servlet Modul
4.8.3
Module ► AOP / Instrumentated Spring
- AOP
- Layer zur Integration eine AOP Alliance kompatiblen aspektorientierten Programmierung
- Methoden Interceptoren
- Cross Cutting Funktionalität
- AspectJ Integration
- Instrumentation
- unterstützt statisches AOP
►compile-time woven version of Spring AOP
- Web Services
- Web Flow
- Security JARs
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 32 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Framework
4.8.4
Module ► Test
- Test
- Layer zur Unterstützung von Testframeworks
- JUnit
- TestNG
- etc.
- synchronisiert und cached den Spring Applikationkontext
- unterstütz isoliertes Mock testen
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 33 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Framework
4.9
Spring Szenarios
typische vollumfängliche Webapplikation
Spring Middle-Tier mit Integration zu einem third-party Web-Framework
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 34 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Framework
Remoting
EJBs – bestehende POJOs anbinden
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 35 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring ins kalte Wasser
5
Spring ins kalte Wasser
Aufbau, Installieren und Betreiben einer Spring Applikation
Voraussetzungen
Voraussetzungen
- JSDK: Java Software Development Kit
- Spring Framework http://www.springsource.org/
- Entwicklungsumgebung
- STS Springsource Toolsuite http://www.springsource.com/products/sts
- Maven
Umgebungsvariablen
- Benutzer- oder Systemvariablen definieren / ergänzen
C:\>set
...
JAVA_HOME=C:\Programme\Java\jdk1.6.0_21
MAVEN_HOME=C:\springsource\maven-2.2.1.RELEASE
Path=%PATH%;C:\springsource\maven-2.2.1.RELEASE/bin
- Maven ausführen
C:\springsource\maven-2.2.1.RELEASE\bin\mvn.bat
5.1
Hello Spring Projekt
- Projekt mit STS als neues Spring Template Projekt erzeugen
- File New Spring Template Project
Simp
Simple Spring Utility Project
Next
- Project name : hello_spring
- top-level package : module.spring.hello
Finish
generierte Spring Deklaration
app-context.xml
context.xml
Deklaration app<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<description>Example configuration to get you started.</description>
<bean id="service" class="module.spring.hello.ExampleService" />
</beans>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 36 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring ins kalte Wasser
generierte Klassen
- generiertes Service Interface Service.java
package org.springframework.integration;
public interface Service {
String getMessage();
}
- generierte Service Implementierung ExampleService.java
package org.springframework.integration;
public class ExampleService implements Service {
public String getMessage() {
return "Hello world!";
}
}
- generierte Testklasse ExampleConfigurationTests.java
@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class ExampleConfigurationTests {
@Autowired
private Service service;
@Test public void testSimpleProperties() throws Exception {
assertNotNull(service);
}
}
- generierte Testklasse ExampleServiceTests.java
public class ExampleServiceTests extends TestCase {
private ExampleService service = new ExampleService();
public void testReadOnce() throws Exception {
assertEquals("Hello World", service.getMessage());
}
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 37 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring ins kalte Wasser
Übung Spring Container instanziiert Bean durch Setter
- Ergänzen Sie die Spring Deklaration app-context.xml mit der Property message
<bean id="service" class="module.spring.hello.ExampleService" >
<property name="message" value="Hello Spring" />
</bean>
- Ergänzen Sie die ExampleService Klasse durch die entsprechenden getter / setter
public class ExampleService implements Service {
private String
message;
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
}
- Testen Sie die Applikation mit entsprechenden TestCases
@Test
public void testProperty() throws Exception {
assertEquals("Hello Spring", service.getMessage());
}
Übung Spring Container instanziiert Bean durch Argumentenkonstruktor
- Ergänzen Sie die Spring Deklaration app-context.xml mit einem Konstruktor Argument
<bean id="service" class="module.spring.hello.ExampleService" >
<constructor-arg value="Hello Spring" />
</bean>
- Ergänzen Sie die ExampleService Klasse durch den entsprechenden Konstruktor
- Testen Sie die Applikation mit entsprechenden TestCases
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 38 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring ins kalte Wasser
E
Spring Container
Lerninhalte
Containertypen
Spring Context
SpEL Spring Expression Language
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 39 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Container
6
Spring Container
- Komponentenverwaltung
-
Injizieren von Konstruktoren und Änderungsmethoden
Verschalten von Beans
Erstellen und Zerstören von Beans
Erstellen von Assoziationen
Wiederverwenbarkeit ermöglichen
6.1
Spring Containertypen
IoC Container
- org.springframework.beans.factory.BeanFactory
- verantwortlich für Lebenszyklus und Verwaltung
Anwendungskontext
- org.springframework.context.ApplicationContext
- verantwortlich für weiterführende Container-Aufgaben
- Spring AOP Features
- z.B. Transaktionen
- Message Resource Handling
- z.B. Internationalization
- Event Publication
- z.B. Listener
- Application-Layer Kontext
- z.B. für Web Applikationen
- Validierung
- z.B. Nachweis von Gültigkeit, Typ, Bereich, Sinn und Zweck, etc.
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 40 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Container
6.2
wiki
Bean Factory
Der Begriff Fabrikmethode (englisch
(englisch Factory Method)
Method) bezeichnet ein Entwurfsmuster
aus dem Bereich der Softwareentwicklung.
Softwareentwicklung. Das Muster beschreibt, wie ein Objekt
durch Aufruf einer Methode anstatt durch direkten Aufruf eines Konstruktors erzeugt
erzeugt
wird. Es gehört somit zur Kategorie der Erzeugungsmuster.
Erzeugungsmuster.
- Beans erstellen und verwalten
- erstellen von Assoziationen zwischen kollaborierenden Objekten (Beans)
- steuert den Lebenszyklus einer Bean
- falls benutzerdefinierte Initialisierungsmethoden und Zerstörungsmethoden definiert sind
- BeanFactory Interface ist zentrales IoC Container Interface
- verantwortlich für Instanziierung, Konfiguration und Abhängigkeiten
- verschiedene Implementationen des BeanFactory Interface
- out-of-the-Spring-box
- meist wird XmlBeanFactory verwendet
- basiert auf Deklaration durch XML Datei
Aufgaben der BeanFactory
leeren Konstruktor aufrufen
Definition
Autowiring
setter Methoden aufrufen
Abhängigkeiten prüfen
setBeanFactory() aufrufen
afterPropertiesSet() aufrufen
init Methoden aufrufen
Verknüpfungen
definiert
JA
Initialisierung
Clients können über den
ApplicationContext zugreifen
Bereitstellung
Zerstörung
destroy Methoden
Methoden aufrufen
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 41 >> total: 160 Seiten
NEIN
Spring 3 >> Java Framework >> Spring Container
verschiedene RessourceImplementierungen sind vorhanden
org.springframework.core.io.*
ResourceResource-Implementierung
ByteArrayResource
ClassPathResource
DescriptiveResource
FileSystemResource
InputStreamResource
UrlResource
Zweck
Ressource mit Bytearray definiert
Ressource mit Klassenpfad definiert
Ressource mit Beschreibung (keine lesbare) definiert
Ressource mit Informationen aus dem Dateisystem
definiert
Ressource mit Informationen aus einem Datenstrom
definiert
Ressource durch URL definiert
org.springframework.web.portlet.*
ResourceResource-Implementierung
PortletContextResource
ServletContextResource
Zweck
Ressource mit Portlet-Kontext definiert
Ressource mit Servlet-Kontext definiert
XML basierte Container Metadata Konfiguration
<bean id="..." class="...">
<!-- collaborators and configuration
for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration
for this bean go here -->
</bean>
<!-- more bean definitions go here... -->
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 42 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Container
Beispiel Container Instanziierung
- Lesen der Bean Definition aus XML-Datei aus Dateisystem
- Container verwendet Lazy Loading
- Factory lädt die Beschreibung der Bean
- Bean wird erst bei Bedarf instanziiert
einige Beispiele
BeanFactory factory = new XmlBeanFactory(
new FileSystemResource("c:/beans.xml"));
oder
Resource resource = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
oder
ClassPathResource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
Übung Spring Factory
- Ergänzen Sie die testReadOnce() Methode in der ExampleServiceTests.java Klasse
- Starten Sie die Spring BeanFactory mit der Spring Konfigurationsdatei
public void testReadOnce() throws Exception {
ClassPathResource res = new ClassPathResource(
"META-INF/spring/app-context.xml");
BeanFactory factory = new XmlBeanFactory(res);
service = (ExampleService) factory.getBean("service");
assertEquals("Hello Spring", service.getMessage());
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 43 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Container
6.3
Anwendungskontext
Erweitert den Handlungs- / Einsatzbereich des Containers
- ermöglicht das Auflösen von Textnachrichten
- Anwendung: Internationalisierung
- universelle Möglichkeit, um Dateiressourcen zu laden
- Anwendung: Bilder
- können Ereignisse für Beans veröffentlichen
- Anwendung: Listener
- validieren von Inhalten
- Anwendung: Nachweis von Gültigkeit, Typ, Bereich, Sinn und Zweck, etc.
häufig verwendete Implementierungen des Applikations
Applikationsk
tionskontext
org.springframework.core.io.
ApplicationContextApplicationContext-Implementierung
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
XmlWebApplicationContext
Zweck
XML Datei im KlassenPfad
XML Datei aus File System
XML Datei aus WEB-Anwendung
Beispiel
- lesen des Applikationskontext
aus XML-Datei des Dateisystems
ApplicationContext context = new
FileSystemXmlApplicationContext("c:/application.xml");
Klassendiagramm
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 44 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Container
6.3.1
Zugriff auf Ressourcen
- der Applikationskontext bietet Unterstützung beim Lesen von Ressourcen
- Zugriff auf die Ressourcen über einen ResourceLoader
org.springframework.core.io.Resource
Methoden
getInputStream()
getFile()
6.3.2
Zweck
liefert InputStream der Ressourcen
liefert File der Ressourcen
Events des Applikationskontext
- der Applikationskontext implementiert das Observer Pattern
- Zusandsänderungen andere Spring Beans werden erkannt
org.springframework.core.io.ApplicationEventPulisher
Events
ContextRefreshEvent
ContextClosedEvent
ContextClosedEvent
RequestHandleEvent
Zweck
wenn der Applikationkontext neu geladen/erzeugt wird
wenn der Applikationkontext geschlossen wird
um den HTTP Request zu lesen
Übung Applikationskontext
- Ergänzen Sie die ExampleServiceTests.java Klasse
- testen Sie den ClassPathXmlApplicationContext
- testen Sie den FileSystemXmlApplicationContext
public void testApplicationContext() throws Exception {
ApplicationContext appContext =
new ClassPathXmlApplicationContext(
"META-INF/spring/app-context.xml");
service = (ExampleService) appContext.getBean("service");
assertEquals("Hello Spring", service.getMessage());
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 45 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Container
6.3.3
Internationalisierung
- bietet Codeunabhängigkeit für Benutzersprachen
- Java offeriert Locale (Kombination aus Sprache und Land en_US)
- Spring bietet einfache Schnittstelle MessageSource (als Konvention)
Suchschlüssel
appContext.getMessage("welcome",
new Object[] {"Spring"}, "Hello {0}", Locale.ENGLISH));
Stellvertreter
Default
Suchkriterium:
_de.properties
Argument
Übung Internationalisierung
- erstellen Sie entsprechende Propertydateien für Begrüssungstexte / Errortexte
► rescources/messages_de.properties ► Konvention
- ergänzen Sie die Springkonfiguration app-context.xml durch eine messageSource
- erstellen Sie entsprechende Testfunktionen
messages
messages_de.properties
welcome=Willkommen zu Spring
appapp-context.xml
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>messages</value>
// 'messages_' + LOCALE + '.properties'
<value>errors</value>
// 'errors_' + LOCALE + '.properties'
</list>
</property>
</bean>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 46 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Container
6.4
Nachbearbeitung
Basis zu AOP (Aspekt Orientiertem Programmieren ) Weaving
- Spring stellt die Schnittstelle zur Verfügung BeanPostProcessor
- mit den Methoden
- postProcessBeforeInitialisation()
- postProcessAfterInitialisation()
- Beispiel RequiredAnnotationBeanPostProcessor
- prüft die Abhängigkeiten der Bean Exception
ÜBUNG Bean nachbearbeiten Abhängigkeiten prüfen
- ergänzen Sie die Setter Methode der Bean Property mit der @Required Annotation
und die Spring Bean Konfiguration durch das entsprechende Interface
<bean class="org.springframework.beans.factory.
annotation.RequiredAnnotationBeanPostProcessor"
/>
6.5
SpEL Spring Expression Langauge
EL erlaubt den Zugriff auf Variablen und definiert entsprechende Operatoren
- Auswerten von Ausdrücken zur Laufzeit
- Parameter berechnen lassen
- ermöglicht flexiblen Code
Syntax
#{bean}
// gibt das Objekt 'bean' zurück
#{bean.var}
// ist 'bean' ein Object wird das Attribut var gelesen
ist 'bean' eine Map oder Property wird der Wert zum
Key 'var' gelesen
#{1+3}
// wertet den Ausdruck aus
SpEL ermöglicht es,
es, dynamisch zu konfigurieren.
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 47 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Container
ÜBUNG SpEL
-
erweitern Sie die Attribute des ExampleService
- setzen Sie diese Attribute durch die Setter Injection
<property name="text" value="#{prop.text}" />
<property name="sprache" value="#{ systemProperties['user.language'] }" />
<property name="zahl" value="#{1+2}" />
- Propertry Objekt aus Property Datei erstellen
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<util:properties id="prop" location="welcome.properties" />
- ergänzen Sie die Maven Dependencies
- Version 3.0.2.RELEASE (neuste Version)
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 48 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Container
F
Dependency Injection
Lerninhalte
Bean Ressourcen
Lebenszyklus
Namespace
Annotations
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 49 >> total: 160 Seiten
Spring 3 >> Java Framework >> Lebenszyklus
7
Lebenszyklus
- Bean (Lebenszyklus) wird durch BeanFactory-Container verwaltet
- ohne Referenz Garbage Collector
Spring Container Prozess
does not exist
DestroyDestroy-Methoden
Methoden
Disposa
DisposableBean.destroy()
bleBean.destroy()
Client Prozess
Geschäftsfall
exists
Spring Container
Container Prozess
1 BeanNameAware.setBeanName()
2 BeanFactoryAware.setBeanFacrory()
3 ResourceLoaderAware.setRescourceLoader()
4 ApplicationEventPublisherAware.
setApplicationEventPublisher()
5 MessageSourceAware.setMessageSource()
6 ApplicationContextAware.
setApplicationContext()
7 ServletContextAware.setServletContext()
8 BeanPostProcessor.
postProcessorBeforeInitialisation()
9 InitializigBean.afterPropertySet()
InitializigBean.afterPropertySet()
10 InitInit-Methoden
11 BeanPostProcessor.
afterProcessorBeforeInitialisation()
Spring Bean LifeCycle
Schritt
1
2
3
4
5
6
7
8
9
10
11
Phase
Beschreibung
bekommt den eigenen Namen zur späteren Referenzierung
bekommt eine Referenz auf die Bean Factory
lädt Resourcen Bean Abhängigkeiten
Zufgriff auf die
kann Events verschicken vorgestellten Verfahren
Umgebung
kann internationalisierte Texte auslesen
bekommt Referenz auf den Applikationskontext
bekommt den Servletkontext referenziert
Bean verändern ruft die konfigurierten Post-Processoren auf
eigene
Abhängigkeiten überprüfen
Initialisierung
init Methode wird aufgerufen
ruft die konfigurierten Post-Processoren zur Nachbearbeitung
Bean verändern
auf
Bean ist einsatzbereit für die Anwendung
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 50 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
8
Bean Ressourcen definieren
- Laden von externen Bean Definitionen durch die XML Konfiguration
<beans>
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="resources/themeSource.xml"/>
<bean id="bean1" class="..."/>
<bean id="bean2" class="..."/>
</beans>
- Laden von externen Bean Definitionen durch Annotation @Resource
- nur auf Attributen und set-Methoden
@Resource // inject bean named 'dataSource'
private DataSource dataSource;
8.1
Dependency Injection per XML
durch Dependency Injection
- Abhängigkeiten werden einem Objekt injiziert
- Objekte
- Datenquellen
- ein Objekt muss das abhängige Objekt nicht selbst erzeugen
- durch JNDI Referenz
- durch Referenzieren
- durch Instanziieren aus Factory
- Abhängigkeiten werden durch den Lebenszyklus beeinflusst
<bean id="lesen"
class="Lesen"
depends-on="schreiben" />
<bean id="schreiben"
class="Schreiben" />
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 51 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
8.1.1
Setter Injection
- Setter basierte DI
- Spring instanziert Bean mit Hilfe der Settermethode
- Settermethode muss existieren
public class SimpleMovieLister {
// the SimpleMovieLister has a dependency on the MovieFinder
private MovieFinder movieFinder;
// a setter method so that the Spring container can 'inject'
// a MovieFinder
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// business logic that actually 'uses' the injected MovieFinder
// is omitted...
}
8.1.2
Konstruktor Injection
- Konstrukter basierte DI
- Spring instanziert Bean mit Hilfe des Konstruktors
- Konstruktor mit entsprechender Signature muss existieren
public class SimpleMovieLister {
// the SimpleMovieLister has a dependency on the MovieFinder
private MovieFinder movieFinder;
// Spring container can 'inject' a MovieFinder
public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// business logic 'uses' the injected MovieFinder is omitted...
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 52 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
8.1.3
Konstruktor vs. Setter Dependency Injection
Pro Konstruktor DI
-
Konstruktorinjektion erzwingt starke Abhängigkeitsregeln
Bean kann nicht instanziiert werden, ohne all ihre Abhängigkeiten zu erhalten
Änderungsmethoden sind nicht erforderlich, da Abhängigkeiten über Konstruktor festgelegt
versehentliche Modifikationen des Konstruktors wird ausgeschlossen
Pro Setter DI
-
Parameterliste des Konstruktors kann recht umfangreich werden
eindeutige Konstruktoren zu formulieren kann schwierig sein
mehrere Parameter desselben Typs macht (Zweck-) Unterscheidung schwerer
Konstruktorinjektion ist zur Vererbung eher ungeeignet
Parameter an super() übergeben
Beispiel www.springsource
www.springsource.org
source.org
public class ExampleBean {
private AnotherBean
beanOne;
private YetAnotherBean beanTwo;
private int
i;
public void setBeanOne(AnotherBean beanOne) {
this.beanOne = beanOne;
}
public void setBeanTwo(YetAnotherBean beanTwo) {
this.beanTwo = beanTwo;
}
public void setIntegerProperty(int i) {
<bean id="exampleBean" class="examples.ExampleBean">
this.i = i;
<!-- setter injection with nested <ref/> element -->
}
public void doSomething() { <property name="beanOne">
this.beanOne.doSomething(); <ref bean="anotherExampleBean"/>
</property>
}
<!-- setter injection with neater 'ref' attribute -->
}
<property name="beanTwo" ref="yetAnotherBean"/>
<property name="integerProperty" value="1"/>
</bean>
<bean id="anotherExampleBean"
class="examples.AnotherBean"/>
<bean id="yetAnotherBean" class="examples.YetAnotherBean"/>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 53 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
8.1.4
Collections
- Injection von Abhängigkeiten über Collections
- Best Praxis ► Collection der MVC oder O/R Implementation verwenden
Collection
Element
<list>
<set>
<map>
<props>
Package
java.util.List
java.util.Set
java.util.Map
java.util.Properties
Verwendung
Liste von (auch duplikaten) Werten
Liste von duplikatfreien Werten
beliebige Namen-Werte-Paare
String Namen-Werte-Paare
Beispiel mit <list> Collection
public class ExampleBean {
private Collection<Instrument> instruments;
public void setInstruments(
Collection<Instrument> instruments) {
this.instruments = instruments;
}
}
<bean id="exampleBean"
class="examples.ExampleBean">
<property name="instruments">
<list>
<ref bean="guitar"/>
<ref bean="violin"/>
<ref bean="piano"/>
</list>
</property>
</bean>
Beispiel mit <map> Collection
public class ExampleBean {
private Map<String, Instrument> instruments;
public void setInstruments(Map<String, Instrument> instruments) {
this.instruments = instruments;
}
}
<bean id="exampleBean" class="examples.ExampleBean">
<property name="instruments">
<map>
<entry key="Gitarre" value-ref="guitar"/>
<entry key="Geige" value-ref="violin"/>
<entry key="Klavier" value-ref="piano"/>
</map>
</property>
</bean>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 54 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
8.1.5
Leerer Inhalt als Property zuweisen
- Eigenschaft auf NULL setzen
- mit DI zuweisen
- als NULL Referenzierung
Beispiel mit <null> Referenzierung
<property name="instruments"> <null> </property>
► null ist als Tag definiert
8.1.6
Autowiring
- Beanelemente <bean> automatisch zuweisen
- durch Spring Container
Autowiring
Typ
byName
byType
Beschreibung
Übereinstimmung von ID
oder Name der Eigenschaft
oder Bean-Eigenschaft bleibt leer
Übereinstimmung des Typs der Eigenschaft
oder Bean-Eigenschaft bleibt leer
oder Exception bei mehrfachem Aufkommen
org.springframework.beans.factory.UnsatisfiedDependencyException
gesucht wird eine identische Signature der Konstruktoren
constructor oder Exception bei keiner Eindeutigkeit
org.springframework.beans.factory.UnsatisfiedDependencyException
autodetect
gesucht wird nach constructor dann nach byType
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 55 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
8.1.7
-
Init- und Destory-Methoden
init- und destroy-Methoden festlegen
um Bean nach ihrer Erzeugung zu initialisieren
wenn Bean vor ihrer Zerstörung noch Aktionen vorzunehmen hat
optional und einzeln einsetzbar
Beispiel
public class ExampleBean {
public void init() {
...
}
public void cleanup() {
...
}
}
<bean id="exampleBean"
class="examples.ExampleBean"
init-method="init"
destroy-method="cleanup"/>
8.1.8
Geltungsbereich für Beans
- steuert, wie viele Instanzen einer Bean erstellt werden
singletonsingleton-Beans
- durch Spring erzeugte Beans werden als statische Objekte behandelt
- als Eigenschaft anderen Beans als eine Instanz (Singleton) erzeugt und zugewiesen
- und an jeder Stelle, wo die Bean referenziert wird, verwendet
- eine Bean Instanz wird erzeugt
- als gemeinsame Instanz allen referenzierten Objekten injiziert
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 56 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
prototyperototype-Beans
- durch Spring erzeugte Beans
- als Eigenschaft anderen Beans zugewiesen
- und als eigene Instanz erzeugt
- für jede Referenzierung wird eine neue Bean Instanz erzeugt
Geltungsbereich für Beans
scope
Geltungsbereich
Beschreibung
singleton
Bean wird nur einmal erzeugt und bei jeder Referenz die gleiche Bean
verwendet (Default)
prototype
bei jeder Referenz wird eine neue Instanz der Bean erzeugt und
verwendet
request
für jeden Request (Web-Kontext) wird eine neue Instanz erzeugt
session
für jede Session (Web-Kontext) wird eine neue Instanz erzeugt
globalSession für jede Global HTTP Session (Portlet-Kontext) wird eine Bean erzeugt
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 57 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
8.1.9
Attribute der Beandefinition
<bean> Tag
Name
Beschreibung
class
id
name
scope
lazylazy-init
initinit-method
destroydestroy-method
dependencydependency-check
autowiring
autowireautowire-candidate
factoryfactory-bean
factoryfactory-method
abstract
parent
vollqualifizierter Klassenname zur Instanziierung
Zeichenfolge zum Referenzieren auf Bean oder Klassennamen als ID
als Alias auch mehrere; durch Strichpunkt getrennt
definiert den Geltungsbereich der Bean
lazy = träge, lädt die Bean erst bei der ersten Anfrage
Initialisierungs-Methode, die nach dem Laden aufgerufen wird
Destroy-Methode, die in der Zerstörungsphase aufgerufen wird
überprüft, ob alle Bean-Abhängigkeiten korrekt aufgelöst wurden
konfiguriert das automatische Verknüpfen
definiert autowiring Modus für die Bean
definiert Factory Bean für das Erstellen der Bean
definiert Factory Methode für das Erstellen der Bean
definiert Bean als abstract
definiert parent Bean für das Erstellen der Bean
8.2
Context Namespace
- erlaubt Applikationcontext spezifische Konfigurationen
- Unterstüzung für Annotationen
- verwalten von Domänenobjekten
Context Namespace
Name
context:annotation--config>
<context:annotation
<context:component<context:component-scan>
<context:exclude
<context:excludetext:exclude-filter>
<context:include<context:include-filter>
<context:load<context:load-timetime-weaver>
<context:mbean<context:mbean-export>
export>
<context:mbean<context:mbean-server>
<context:property<context:property-placeholder>
<context:spring<context:spring-configured>
Beschreibung
erlaubt Annationen basierte Konfiguration in Spring Beans
scannt und registriert Packages nach Beans
schliesst Klasse von der Registrierung als Springbean aus
schliesst Klasse in der Registrierung als Sprinbean ein
registriert einen AspectJ load-time weaver
exportiert Bean als JMX MBean (Jave Management Extension)
startet ein MBean (Server Aufgabe) im Sringcontext
ermöglicht externe Konfiguration per Propertydatei
ermöglicht Dependenci Injection in Nicht-Spring-Verwaltete Objekte
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 58 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
8.3
Util Namespace
- erlaubt Applikationcontext spezifische Typen
- Unterstüzung von Collections
- Unterstüzung von Nicht-Spring Objekte
Util Namespace
Name
<util:constant>
<util:list>
<util:map>
<util:properties>
<util:set>
<util:property<util:property-path>
Beschreibung
registriert ein static Feld als Typ, stellt dessen Wert als Bean zur Verfügung
macht eine Liste von Werten oder Referenzen als Spring Bean bekannt
macht eine Map als Spring Bean bekannt
erzeugt eine java.util.Property als Spring Bean von einer Propertydatei
macht ein Set als Spring Bean bekannt
referenziert eine Bean Property und stellt diese als Spring Bean zur Verfügung
- <util:constant> erzeugt eine Referenz zur Konstante MY_CONST der Klasse MyClass
<util:constant id=”myconst” static-field=”MyClass.MY_CONST” />
ÜBUNG Dependency Injection per XML
- erstellen Sie Spring Beans wie folgt
- testen Sie die XML Attribute der Dependency Injection
public class Bean1 {
private Bean2 bean2;
private float property;
private Logger logger = Logger.getLogger("spring");
public Bean1() {
logger.info("Bean1 Konstruktor");
}
// getter und setter analog
}
Lösungsansatz:
<bean id="bean2"
class="module.spring.di.xml.Bean2"
scope="prototype"
init-method="init"
destroy-method="destroy">
<property name="message">
<value>Hallo Spring</value>
</property>
</bean>
public class Bean2 {
private String message;
// Konstruktor, getter und setter analog
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 59 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
8.4
Dependency Injection per Annotation
- als Alternative zu XML
8.4.1
Context Configuration Annotation
- benötigt <context:annotation-config /> in der Spring Konfiguration
Context Configuration Annotation
Annotation
Einsatz Beschreibung
@Autowired
K F M entspricht autowire="byType", muss nicht public sein
@Configurable
@Order
@Qualifier
@Rescource
@Required
@Scope
@Value
für Domänenobjekte die nicht durch Spring erzeugt wurden
im Zusammenhang mit <context:annotation-config />
CT
TMF
FPTA
FM
M
T
FM
Sortiermöglichkeit
für Autowiring zusätzlich zu "byType", sucht auch nach dem Qualifier
für Autowiring zusätzlich zu "byType", sucht auch nach der Ressource
erzwingt Abhängigkeit
definiert den Scope
für Autowiring zusätzlich zu "byType", sucht auch nach dem EL-Ausdruck
A = Annotationtype, C = Klasse, F = Field, K = Konstruktor, M = Setter, P = Parameter,
Parameter, T = Typ
ÜBUNG Dependency Injection per Annotation Context Configuration
- erstellen Sie Spring Bean ConfigImpl und das entsprechende Interface Config
public class ConfigImpl implements Config {
private Map<String, String> prefs = new HashMap<String, String>();
public String getValue(String key) {
return this.prefs.get(key);
}
public void setValue(String key, String value) {
this.prefs.put(key, value);
}
}
- erstellen Sie einen Write- und einen ReadController
- testen Sie die Annotation, z.B. @Autowired durch entsprechende ControllerTests
public class WriteController {
@Autowired private Config config;
// Config-Objekt wird von Spring injiziert
public WriteController() {}
public void write(String key, String value) { this.config.setValue(key, value); }
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 60 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
8.4.2
Stereotyping Annotations
- Klassen werden als Spring Beans erkannt und konfiguriert
- reduziert die XML Konfiguration
- benötigt <context:component-scan base-package=”…” /> in der Spring Konfiguration
Stereotyping Annotations
Annotation
Einsatz Beschreibung
@Component Type generische durch Spring kontrollierte Komponente
@Controller
Type stereotypisiert Komponenten als Spring MVC Kontroller
@Repository Type deklariert Klasse als Repository / transferiert SQL- zu DataAccessExceptions
@Service
Type stereotypisiert Komponenten als Service
Selbstdefinierte @Component Annotation
@Target( { ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface MyComponent { String value() default ""; }
ÜBUNG Dependency Injection per Annotation Stereotyping
- verwenden Sie die @MyComponent Annotation, um die Kontroller Spring zu übergeben
@MyComponent("reader")
public class ReadController {
@Autowired
private Config config;
- analog die ConfigImpl
@MyComponent("config")
public class ConfigImpl implements Config {
- und entsprechende Tests
wc = (WriteController) ac.getBean("writer");
rc = (ReadController) ac.getBean("reader");
ci = (ConfigImpl) ac.getBean("config");
wc.write("Hallo","Spring");
assertEquals("ConfigImpl.getValue", "Spring", rc.read("Hallo"));
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 61 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
8.5
XML vs. Annotaions Dependency Injection
Spring offeriert zwei unterschiedliche Ansätze zur Konfiguration der Beans
- XML
- Komplexität durch verschiedene Versionen
- Annotationen
- ergänzt durch XML Basis Konfiguration
Pro XML Dependency Inj
Injection
- Konfiguration ausserhalb der Domänenlogik
- bereits existierenden Klassen müssen nicht angepasst / erweitert werden
- Klassen bleiben unabhängig von Spring
Pro Annotation Dependency Injection
- Abhängigkeiten sind im Code ersichtlich
- kein XML notwendig
- keine überladene, unübersichtliche XML Konfiguration
G
Spring AOP
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 62 >> total: 160 Seiten
Spring 3 >> Java Framework >> Bean Ressourcen definieren
Lerninhalte
Begriffe
Spring AOP
Framework
Annotations
9
Aspektorientiertes
Aspektorientiertes Programmieren
- Aspektorientierung kapselt sich wiederholende Aufgaben
- Aufgabe einmal programmiert
- an mehreren Stellen ausgeführt
- AOP trennt Businesslogik von Services
- Logging
- Transaktions-Management
- Sicherheits-Managment
- AOP verwaltet zentrale Aufgaben wiederverwendbar
- Datenbank-Zugriffe
- Caching
- Authentisierung
Crossross-Cutting Concern
- querschnittliche Belange einer Software
- erlauben keine Modularisierung
► AOP bietet Lösungsansatz
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 63 >> total: 160 Seiten
Spring 3 >> Java Framework >> Aspektorientiertes Programmieren
9.1
Begriffe des AOP
- Advice
- Cross-Cutting Concern
- Softwarecode, der zur Ausführung kommt
- Logging
- Transaktionsmanagement
- JoinPoint
- impliziert gegebene Ausführungspunkte für Advise
- vor Methodenaufruf
- nach Methodenaufruf
- bei Exception
- etc.
- eingrenzendes Muster vorhandener JoinPoints
- als Klassenfilter und Methodenmatcher
- definierte Use Cases
- ServiceMethoden
Use
- DAO Funktionalitäten
JoinPoints
Case
PointCut
- PointCut
Advice
Begriffe in der Aspektorientierten Programmierung
AOP
Begriff
Beschreibung
Aspect
Aufgabe, die an verschiedenen Stellen im Programm benötigt wird, z.B. Logging
Joinpoint
Punkt im Programmfluss, an dem der Aspect eingreift
(z.B. Methoden, Exceptions, etc. Spring erlaubt nur Methoden als Joinpoints)
Advice
Aktion eines Aspekts am Joinpoint, also der Aspect, der am Joinpoint ausgeführt wird
Pointcut
Muster, das den Aspect eingrenzt (als Klassenfilter und Methodenmatcher)
Target
Objekt, das Joinpoints zur Verfügung steht (z.B. Parameter der Signature)
Proxy
Proxy-Objekt wird aus dem Target erstellt
Weaving
Weaving beschreibt den Vorgang, aus Targets Proxys zu erstellen
- beim Kompilieren (statisches AOP)
- zur Laufzeit (dynamisches AOP)
Introduction
ermöglicht einem Target zusätzlich (dynamische) Funktionalität
z.B. erkennt das Interface Modifiable Änderungen innerhalb des Targets
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 64 >> total: 160 Seiten
Spring 3 >> Java Framework >> Aspektorientiertes Programmieren
9.2
Spring AOP
Definieren von AOP per:
- @AspectJ
- Spring XML
- Spring Annotations
Weaving
- Weaving wird bei Spring zur Laufzeit durchgeführt
- verwendet Ansatz des dynamischen AOP
- im Gegensatz zu statischem AOP wie beim AspectJ
- AspectJ ist eine Spracherweiterung, die der Javasyntax Befehle hinzufügt
- AspectJ hat seinen eigenen Compiler
- Advices sind damit (statisch) im Java-Bytecode des AspectJ-Compilers enthalten
Dynamisches AOP (weaving zur Laufzeit) hat grundsätzlich schlechtere
Performance gegenüber statischem AOP (weaving zur Compilezeit), bietet
jedoch mehr Flexibilität.
Flexibilität.
9.3
Spring AOP Framework
- bietet zahlreiche Vorteile
- ist in dem IoC-Container integriert
- kann als Library leicht in jede Applikation eingebunden werden
- Maven org.springframework : spring-aop : ${spring.framework.version}
aspectj : aspectjrt : 1.5.4
aspectj : aspectjweaver : 1.5.4
- enthält bereits vorgefertigte Aspekte
- z.B. Transaktionsverhalten
- ist unabhängig vom verwendeten Compiler und Classloader
- kann leicht zwischen Applikationsservern portiert werden
- implementiert Interfaces der AOP-Alliance
- dadurch entsprechende Unabhängigkeit
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 65 >> total: 160 Seiten
Spring 3 >> Java Framework >> Aspektorientiertes Programmieren
Ablauf
9.3.1
Aspect
- kann in Spring eine normale Java-Klasse (Spring Bean) sein
- wird mit dem XML-Element <aop:aspect/> definiert und referenziert eine Bean
- referenzierte Bean stellt die Implementierung der Funktionalität dar
- referenzierte Bean ist ein Cross-Cutting Concern
- Logging, Transaktions-Management, Security, etc.
- Spring stellt Aspekte für deklarative Enterprise Services bereit
- deklaratives Transaktions-Management
- Definition eigener Aspekte
- Geschäftsprozess abfangen, überwachen, manipulieren, etc.
<aop:config>
<aop:aspect id="myAspect" ref="aBean">
...
</aop:aspect>
</aop:config>
<bean id="aBean" class="..."/>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 66 >> total: 160 Seiten
Spring 3 >> Java Framework >> Aspektorientiertes Programmieren
9.3.2
Joinpoint
Ein Joinpoint ist eine Stelle im Programm, an der ein Aspect eingesetzt wird.
- ein Joinponit fügt der Anwendung neues Verhalten hinzu
- neue Methode wird aufgerufen
- Exception-Handling
- ändern einer Klassenvariable
Spring AOP stellt
stellt nur
nur Methoden als Joinpoints zur Ausführung.
Ausführung.
9.3.3
Advice
Advices werden an Joinpoints der Anwendung hinzugefügt.
- Advice sagt, an welcher Stelle ein Aspect an einem Joinpoint was tun soll
- verschiedene Advice-Typen sind möglich
Advice in Spring
Advice
Beschreibung
AfterReturningAdvice
Aspect nach Ausführung der Methode (wenn keine Exception geworfen wird)
MethodBeforeAdvice
Aspect vor Ausführung der Methode (wenn Aspect keine Exception wirft)
MethodInterceptor
Aspect vor und nach dem Methodenaufruf
ThrowsAdvice
Aspect nach einer Exception
Klassenhie
Klassenhierarchie
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 67 >> total: 160 Seiten
Spring 3 >> Java Framework >> Aspektorientiertes Programmieren
9.3.4
Pointcut
bestimmt, an welchen Joinpoints ein Advice hinzugefügt wird
- ein Advice ist mit einen Pointcut verbunden
- ein Advice wird an jedem Joinpoint ausgeführt, der dem Pointcut-Ausdruck entspricht
- ein Pointcut kann innerhalb eines Aspektes definiert werden und steht dann nur für diesen zur Verfügung
Um Joinpoints in einem Pointcut zu beschreiben, benutzt Spring die
AspectJ Pointcut Language http://www.eclipse.org/aspectj
<aop:config>
<aop:aspect id="myAspect" ref="aBean">
<aop:pointcut id="businessService"
expression="execution(* *.perform(..))"/>
...
</aop:aspect>
</aop:config>
AspectJ Pointcuts
für jedes Packages für jede Klasse
Methode perform()
execution(* *.*.perform(..))
Ausführungs-Muster
bei jedem
Rückgabetyp
Klassendiagramm
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 68 >> total: 160 Seiten
mit beliebigen Typen
und Parametern ..
Spring 3 >> Java Framework >> Aspektorientiertes Programmieren
9.3.5
Advice definieren
- Spring definiert AOP Namespace
- erlaubt, Aspekte, Pointcuts und Advices
in einem Spring Kontext zu definieren
- gibt auch Unterstüzung
für @AspectJ Annotationen
Spring definiert folgende Arten von Advices
- bestimmen, wie der Advice ausgeführt wird
AOP Namespace
Begriff
Beschreibung
<aop:before
<aop:before>
before>
Advice wird vor dem PointCut ausgeführt
<aop:after
<aop:after>
after>
Advice wird nach dem PointCut ausgeführt
<aop:after<aop:after-returning> Advice wird nach dem PointCut ausgeführt (ohne Exception)
<aop:after
<aop:afterafter-throwing>
throwing> Advice wird ausgeführt, wenn der Pointcut eine Exception wirft
<aop:around
<aop:around>
around>
Advice wrapt den Pointcut
weitere Elemente im AOP Namespace
Begriff
Beschreibung
<aop:advisor>
definiert einen AOP Advise
<aop:aspect>
definiert einen AOP Aspect
<aop:aspect<aop:aspect-autoproxy> erlaubt Aspektdeklaration mittels AspectJ
<aop:config>
das parent Element im AOP Namespace
<aop:declare<aop:declare-parents>
definiert eine AOP Introduction AOP Funktionalität ergänzen
<aop:include>
definiert optionale AspectJ Proxys
<aop:pointcut>
deklariert einen Pointcut um einen Advice hinzuzufügen
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 69 >> total: 160 Seiten
Spring 3 >> Java Framework >> Aspektorientiertes Programmieren
Beispiel
<aop:config>
<aop:pointcut id=”myPointcut” expression=”execution(* *.*service(..))" />
<aop:aspect ref=”myAspect”>
<aop:before pointcut-ref=”myPointcut” method=”invokeBefore” />
</aop:aspect>
</aop:config>
Advice mit einem Pointcut verbinden
<aop:aspect id="aroundExample" ref="aBean">
<aop:after-throwing method="trace"
throwing="ex"
pointcut="execution(void test.Process.doIt(bo.VO))" />
</aop:aspect>
<aop:aspect id="aroundExample" ref="aBean">
<aop:pointcut id="service" expression="execution(* *.do*(..))" />
<aop:around pointcut-ref="service" method="invoke"/>
</aop:aspect>
mögliche Implementation der invoke Methode
public Object invoke(ProceedingJoinPoint invocation) throws Throwable {
// vor dem Methodenaufruf
Object retVal = invocation.proceed();
// nach dem Methodenaufruf
return retVal;
}
oder
public Object invoke(ProceedingJoinPoint invocation) throws Throwable {
Object[] args = invocation.getArgs();
try {
rval = invocation.proceed();
} catch (Throwable t) {
throw t;
} finally {
return rval;
}
// (Client-) Parameter auslesen
// Target aufrufen
// Exceptions loggen / weitergeben
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 70 >> total: 160 Seiten
Spring 3 >> Java Framework >> Aspektorientiertes Programmieren
ÜBUNG AOP per XML
- erstellen Sie eine Fassaden- und eine Serviceklasse
- implementieren Sie eine Interceptorklasse
- konfigurieren und testen Sie die Beans
<bean id="myService" class="module.spring.aop.MyService" />
<bean id="myFacade" class="module.spring.aop.MyFacade" />
<bean id="myAspect" class="module.spring.aop.Interceptor" />
<aop:config>
<aop:aspect ref="myAspect">
<aop:pointcut id="publicFacade"
expression="execution(* module.spring.aop.*Facade.do*(..))" />
<aop:pointcut id="serviceMethods" expression="execution(* *.do*(..))" />
<aop:before method="logBefore" pointcut-ref="publicFacade" />
<aop:after method="logAfter" pointcut-ref="publicFacade" />
<aop:around method="invoke" pointcut-ref="serviceMethods" />
</aop:aspect>
</aop:config>
<aop:aspectj-autoproxy />
- benötigt CGLIB zur dynamischen Kapselung von Klassen
- Maven cglib : cglib-nodep : 2.1_3
9.4
AOP per Annotation
- Spring unterstützt AspectJ Annotations
AOP Annotations
Annotation
Einsatz
Beschreibung
@Aspect
@After
@AfterReturning
Type
Method
Method
deklariert eine Klasse als Aspect
@AfterThrowing
Method
deklariert die Methode für einen Pointcut, der eine Exception wirft
@Around
Method
deklariert die Methode, um einen Pointcut zu umschliessen
@Before
Method
deklariert die Methode vor einem Pointcut
deklariert die Methode nach einem Pointcut
deklariert die Methode für einen erfolgreichen Pointcut
@DeclareParents Static Field deklariert Parent Objekt für Introductions zusätzliche Funktionalität
@Pointcut
Method
deklariert einen leeren Methoden-Body als Pointcut Platzhalter
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 71 >> total: 160 Seiten
Spring 3 >> Java Framework >> Aspektorientiertes Programmieren
ÜBUNG AOP per Annotation
- modifizieren Sie die AOP Übung
- eliminieren Sie die XML Deklarationen
- ergänzen Sie eine Pointcut Methode und annotieren Sie die Advices
- annotieren Sie die Interceptorklasse als Aspect
@Aspect
public class Interceptor {
@Pointcut("execution(* module.spring.aop.*.*(..))")
public void debugPointcut() {
}
@Before("debugPointcut()")
public void logBefore() {
}
@After("debugPointcut()")
public void logAfter() {
}
H
Testen
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 72 >> total: 160 Seiten
Spring 3 >> Java Framework >> Aspektorientiertes Programmieren
Lerninhalte
Testarten
TDD TestDrivenDevelopment
Unit Testing
Mock Objekte
10
Testen
wiki
Ein Softwaretest
Softwaretest ist ein Test während der Softwareentwicklung,
Softwareentwicklung, um die Funktionalität
einer Software an den Anforderungen und ihre Qualität zu messen und Softwarefehler
zu ermitteln.
10.1
Testarten
- Unit-Test
- Units sind einzelne Objekte
- isoliertes Verhalten wird getestet
- Integrationstest
- mehrere Objekte bilden ein Workflow
- deren Interaktion wird getestet
- Lasttest
- Skalierbarkeit des Workflows
- grosse Anzahl von Requests wird getestet
- Akzeptanztest
- Anforderungen an die Applikation
- Grundlage zur Abnahme
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 73 >> total: 160 Seiten
Spring 3 >> Java Framework >> Testen
Testverfahren
die Praxis beschreibt eine Kombination von Testverfahren
- ZIEL: aussagekräftiges Ergebnis
-
Review – prüft das Ergebnis (Ziel)
Audit – prüft die Vorgehensweise und den Ablauf (Weg ins Ziel)
BlackBlack-BoxBox-Test – prüft definierte Schnittstellen (Funktionalität)
WhiteWhite-Box-Test – prüft die Details der Logik (Codereview)
- Durchführung
- Testprotokoll (wer, wozu, wie, was wird getestet)
- Programm (Test-Case beschreibt Testfall)
die Praxis verlangt Automatisierung der Testverfahren
wiki
iki
Vor allem bei testgetriebener Entwicklung
Entwicklung ist die Testautomatisierung besonders
wichtig. Tests werden im Idealfall nach jeder Änderung ausgeführt. Bei nicht
automatisierten Tests ist der Aufwand so gross, dass häufig auf die Tests verzichtet
wird.
10.2
funktional vs. nicht-funktional
funktionale Tests
Tests
► Benutzeranforderungen
- gemäss Anforderungen
- was macht das Programm
- beschrieben durch Use Case
nichtnicht-funktionale Tests
► Qualitätsanforderungen
- Integration
- Zusammenarbeit der einzelnen Teile,
z.B. Server, DB, etc.
- Belastung
- Multi-User Verhalten
- Akzeptanz
- Kunde, Benutzer, etc.
Softwaretests steigern Qualität der Software
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 74 >> total: 160 Seiten
Spring 3 >> Java Framework >> Testen
eXtreme Programming
- alternativer Ansatz
- senkt Softwareentwicklungskosten
- orientiert an Bedürfnissen der Kunden
Der Kunde bekommt das,
was er braucht,
und dann,
wenn er es braucht.
- xP baut auf
- Kommunikation ►Auftraggeber
- Einfachheit ► klare Schnittstellen
- Feedback ► Testen (TDD)
- Courage
►
10.3
Test Driven Development
TDD ist Aspekt von Extreme Programming
- einfache Entwicklung in der Erstellung von Software
- komplexe Softwaresysteme in kleinen und einfachen Schritten entstehen lassen
-
Tests des Designs und der Implementierung stehen im Vordergrund
definiert Test, der die Funktion eines kleinen Teils des Systems beschreibt
Treffen von Design-Entscheidungen sind nicht in der Startphase erforderlich
Code muss nicht von Anfang an richtig sein, dieser wird kontinuierlich refaktoriert
- Ausführung mit Hilfe von (Software)-Tools
- z.B: JUnit (http://junit.org/) meist verbreitet
- durch Assertion (Engl: Aussage, Behauptung)
- asserts(), assertNotNull(), assertEquals(), etc.
// SYNTAX : Assertion
< Assertion> ( <testen> <Kriterium> <gegeben> )
// Beispiel
assert( 1 + 2 == 3 )
gegeben : 3
Kriterium : EQUALS
testen : 1 + 2
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 75 >> total: 160 Seiten
Spring 3 >> Java Framework >> Testen
TDD Konzept definiert Unittests und Refaktorierungen
- erstellen (Logik schreiben)
- Test beschreibt, wie sich ein kleiner Teil der Software
(Unit) verhalten soll
- testen (erfolgreiche Tests definieren)
- Design des Codes ist zweitrangig
- wichtig, dass der Test erfolgreich läuft
- aufräumen (schöneren Code schreiben)
- mittels Refaktorierung (Umorganisation)
überarbeiten, bis der Test wieder fehlerfrei läuft
10.4
wiki
JUnit
JUnit ist ein Framework zum Testen von JavaJava-Programmen, das besonders für
automatisierte UnitUnit-Tests einzelner Units (meist Klassen oder Methoden)
Methoden) geeignet ist.
Es basiert auf Konzepten, die ursprünglich unter dem Namen SUnit für Smalltalk
entwickelt
entwickelt wurden.
ist Framework ► www.junit.org
- unterstützt das Testen von Programmen
- ein einfacher Test definiert
public class BasicTest extends TestCase {
public void setUp() { ... }
public void testFirstThing() {
assert...(...);
}
public void testSecondThing() {
assert...(...);
}
public void tearDown() { ... }
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 76 >> total: 160 Seiten
Spring 3 >> Java Framework >> Testen
Aufbau
- die Methode setUp() initialisiert den Testcase
- die Test-Methoden (Testcase) fangen mit test an
- testFristThing()
- testSecondThing()
- die Methode tearDown() finalisiert den TestCase
- Assertions überprüfen die Test-Methoden
- Erfüllen von Anforderungen
- Einhalten von Bedingungen
- Exceptions sollten nicht gefangen (catch) werden
- Test-Methoden Exceptions soll Exception werfen
- JUnit-Framework kann dann passend darauf reagieren
- Ausführen von Tests
- Testklasse in Eclipse ausführen ► Run As ►JUnit Test
10.5
wik
Mock Testing
MockMock-Objekte werden in der testgetriebenen Softwareentwicklung DummyDummy-Objekte
oder Attrappen genannt, die als Platzhalter für echte Objekte innerhalb von UnitUnit-Tests
verwendet werden.
isoliertes Testen ist oft nicht möglich
- Interaktion eines Objektes mit dessen Umgebung muss überprüft werden
- Umgebung nicht vorhanden
- oder sehr zeitaufwändig
- Mock-Objekte implementieren Schnittstelle
- Mock-Objekt liefert keine Echtdaten
- nur festgelegte Testdaten
- sinnvolle Mock-Objekte
- Objekt liefert keine deterministische Ergebnisse
- z. B. aktuelle Uhrzeit, aktuelle Temperatur
- Objekt basiert nicht auf Interaktion
- z. B. Testen von Benutzungsoberflächen
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 77 >> total: 160 Seiten
Spring 3 >> Java Framework >> Testen
Ablauf
- Mock Objekt eines Interfaces bzw. einer zu simulierenden Klasse erzeugen
- erwartetes Verhalten aufzeichnen
- auf Wiedergabe umstellen (replay)
- Ablauf Verifizieren (verify)
@Test
public void testErfolgreicheBestellung() throws Exception {
EasyMock.expect(kundeDAOMock.getByID(42)).andReturn(kunde);
Kunde kundeNeu = new Kunde("Eberhard", "Wolff", 22.0);
kundeNeu.setId(42);
kundeDAOMock.update(kundeNeu);
initWareMock();
EasyMock.expect(bestellungDAOMock.save(isA(Bestellung.class)))
.andReturn(new Bestellung());
EasyMock.replay(kundeDAOMock, wareDAOMock, bestellungDAOMock);
Einkaufswagen einkaufswagen = new Einkaufswagen(kunde.getId());
einkaufswagen.add(ware.getId(), 1);
bestellung.bestellen(einkaufswagen);
EasyMock.verify(kundeDAOMock, wareDAOMock, bestellungDAOMock);
}
10.6
UnitTests mit Spring
Spring bietet den Vorteil der Abstraktion
- stellt Schnittstellen zur Integration zur Verfügung
- benötigt ein Framework zum Testen JUnit
- Klasse mit @Test annotierter Methode wird als Testklasse interpretiert
- @Before annotierte Methoden bieten Möglichkeit zum Einrichten des Tests
- @After annotierte Methoden bieten Möglichkeit zum Aufräumen nach dem Test
Ziel: jede Klasse in Isolation testen TD
TDD
In der Praxis lassen sich Klassen oft nicht isoliert testen
Lösungsansätze
Begriff
Beschreibung
Stub
fragmentale Implementierung als Stellvertreter
Dummy
Ersatzklasse, um das Verhalten zu testen
Mock
dynamisches Dummy (konfigurierbar)
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 78 >> total: 160 Seiten
Spring 3 >> Java Framework >> Testen
10.7
wiki
Mocks
MockDummy--Objekte
Mock-Objekte werden in der Testgetriebenen Softwareentwicklung Dummy
oder Attrappen genannt, die als Platzhalter
Platzhalter für echte Objekte innerhalb von Unit
Unit-Tests
verwendet werden.
- dem zu testenden Objekt wird ein Stellvertreter (Mock) zugewiesen
- einfaches Szenario mit Spring
- Spring verwendet Setter Methode
- referenzierte Objekte lassen sich einfach ersetzen
Vorteile
Vorteile
- einzelne Klassen können isoliert getestet werden
- alle referenzierten Klassen werden durch Mocks ersetzt
- Tests sind performant
- keine Datenbanken notwendig
- keine Verteilten Ressourcen notwendig
- Fehler können leicht provoziert werden
- z.B. HostNotFoundException
10.8
-
Integrationstest
@RunWith Annotation erlaubt das Erkennen der Abhängigkeiten z.B. @Autowired
@ContextConfiguration definiert Spring Konfiguration
@Transactional definiert, dass Test in einer Transaktion läuft
@Test(expected= …) definiert das Mockverhalten
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("META-INF/spring/app-context.xml")
@Transactional
public class IntegrationTests {
@Autowired private Service service;
@Test public void testSimpleProperties() throws Exception {
assertNotNull(service);
}
@Test(expected = PropertyException.class)
public void testPropertyException() throws PropertyException {
}
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 79 >> total: 160 Seiten
Spring 3 >> Java Framework >> Testen
transiente Daten
- Spring bietet einfache Konfiguration für Speicher-Datenbank (InMemoryDatenBank)
- erzeugt eine HSQL-Datenbank
- auch H2 und Derby unterstützt
- führt init.sql aus auch classpath:init.sql
<jdbc:embedded-database id="dataSource" type="HSQL">
<jdbc:script location="init.sql" />
</jdbc:embedded-database>
wiki
HSQL ist eine freie vollständig in Java programmierte
programmierte relationale SQLSQL-Datenbank
(RDBMS)
RDBMS) und steht unter einer freien Lizenz nach dem Muster der BSDBSD-Lizenz.
Lizenz.
- bereits bestehende DataSource anbinden
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="init.sql" />
</jdbc:initialize-database>
10.9
Funktionale Tests
- in der Paxis etablieren sich Werkzeuge
- Fit (Framework for Integrated Test) http://fit.c2.com/
- Bedingungen als HTML
- FitNesse http://www.fitnesse.org/
- Bedingungen in wiki
- Testbedingungen werden formuliert und die Resultate auf einem Browser ausgegeben
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 80 >> total: 160 Seiten
Spring 3 >> Java Framework >> Testen
I
ORM
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 81 >> total: 160 Seiten
Spring 3 >> Java Framework >> Testen
Lerninhalte
Architektur
DAO Template
Hibernate
JPA Java Persitenz API
Entity Lebenszyklus
11
ORM ObjectObject-RelationRelation-Mapping
- ORM bietet grundsätzlich folgende Vorteile
-
Produktivität – Vereinfachung und Objektorientierung des Datenzugriffs
- Wartbarkeit – weniger Codezeilen
- Nachvollziehbarkeit – serverseitiger Cache
- Performance – automatisierte Erstellung der SQL Statements
- Unabhängigkeit – abstrahierter Datenbankzugriff
Spring nutzt das DAO-Pattern zum ORM
wiki
Data Access Object (DAO, deutsch: "Datenzugriffsobjekt") ist ein Entwurfsmuster,
Entwurfsmuster,
das den Zugriff auf unterschiedliche Arten von Datenquellen (z. B. Datenbanken,
Dateisystem, etc.) so kapselt, dass die angesprochene Datenquelle ausgetauscht
werden kann, ohne
ohne dass der aufrufende Code geändert werden muss. Dadurch soll
die eigentliche Programmlogik von technischen Details der Datenspeicherung befreit
werden und flexibler einsetzbar sein. DAO ist also ein Muster für die Gestaltung von
Programmierschnittstellen (APIs).
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 82 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
11.1
Architektur
- Spring stellt Vorlagen zur Verfügung
- DAO Template
- JDBC
- Hibernate
- JPA
- iBatis
Verantwortlichkeit
Spring
Entwickler Beschreibung
Verbindungsparameter
Verbindung erstellen
SQL Statement (SQL Parameter) definieren
SQL Statement ausführen und Loop für Resultset vorbereiten
Durch das Resultset iterieren
Exception- und Transactionshandling
Resultset, Statement und Connection schliessen
11.2
DAO Template
Schnittstelle Java / DB
- arbeitet auf der Relation
- SQL als Abfragesprache
- ORM spezifische Querysprache, z.B. Hibernate, JPA, etc
Spring nutzt das Template-Pattern zur DB Integration
wiki
Die Schablonenmethode (engl. template method)
method) ist ein in der Softwareentwicklung
eingesetztes Entwurfsmuster,
Entwurfsmuster, mit dem Teilschritte
Teilschritte eines Algorithmus variabel gehalten
behavorial patterns).
werden können. Es gehört zur Kategorie der Verhaltensmuster ((behavorial
patterns).
spezifische JDBC Templates
Template
Beschreibung
JdbcTemplate
dbcTemplate
Vereinfachung zur Verwaltung der Ressourcen
NamedParameterJ
NamedParameterJdbcTempl
dbcTemplate
Template
Vereinfachung im Umgang mit benannten Parametern
SimpleJdbcTemplate
Vereinfachung im Umgang mit dynamischen Parametern
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 83 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
11.3
JDBCTemplate erzeugen
- JDBC-Template mit Referenz auf Datasource resp. DS Connection
@Resource(name="jdbc/myDB") DataSource ds;
JdbcTemplate template = new JdbcTemplate(ds);
Class.forName("org.gjt.mm.mysql.Driver");
Connection con = DriverManager.getConnection(
"jdbc:mysql://<IP>/myDB", "root", "");
JdbcTemplate template = new JdbcTemplate(new
SingleConnectionDataSource(con, true));
- JDBCTemplate von JdbcDaoSupport erben
public class MyDAO extends JdbcDaoSupport {
@Override
protected JdbcTemplate createJdbcTemplate(DataSource dataSource) {
return super.createJdbcTemplate(dataSource); }}
- JDBCTemplate durch Dependency Injection
<bean id="verlagDAO" class="module.spring.jdbc.xml.VerlagDAO">
<property name="jdbcTemplate" ref="template" />
</bean>
<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db.driverClassName}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean>
Spring proklamiert die Verwendung seiner DAO Implementierung in Umgang mit JDBC
- einfacher in der Handhabung
- weniger fehleranfällig SQLException
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 84 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
Methoden des JdbcTemplate
Methoden
Beschreibung
execute()
führt das SQL Statement aus ohne Ergebnis
query()
führt das SQL Statement aus kann ein Ergebnis zurückgeben
update()
führt das SQL Statement aus gibt Anzahl der geänderten Rows zurück
batchUpdate() führt mehrere SQL Statements aus z.B. String Array definiert
- Methoden sind mit unterschiedlichen Signaturen vorhanden
- lassen den Verwendungszweck optimieren
- JdbcTemplate erzeugt eine Datenbankverbindung
- führt die Anfrage aus und räumt die Ressourcen auf
public List getByName(String name) {
return getJdbcTemplate().query(
"SELECT ID, NAME, KONTOSTAND FROM KUNDE WHERE NAME=?",
new Object[] { name }, new KundeResultSetRowMapper());
}
11.3.1
Query auswerten
- verschiede Callbacks für das Resultset stehen zur Vefügung
Resultset Callbacks
Callback
Beschreibung
ResultSetExtractor
Iteration über das Resultset erzeugt Mapperobjekte
RowCallbackHandler zeilenweises Mapping in Collections
RowMapper
übersetzt jede Zeile in ein Objekt
- mögliche RowMapper Implementation der vorgängigen getJdbcTemplate().query
private class KundeResultSetRowMapper implements RowMapper<Kunde> {
public Kunde mapRow(ResultSet rs, int rowNum) throws SQLException {
Kunde kunde = new Kunde(rs.getString(2), rs.getDouble(3));
kunde.setId(rs.getInt(1));
return kunde;
}
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 85 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
ÜBUNG JDBC
- CRUD für VerlagVO als Entityobjekt
- erstellen Sie das Entityobjekt Verlag
- erstellen Sie die entsprechenden DAO Klassen
- VerlagDAO und VerlagDAOImpl
- erstellen Sie die Spring Konfiguration
<bean id="verlagID"
class="module.spring.di.xml.VerlagDAOImpl"
init-method="initMethod"
scope="singleton">
<property name="jdbcTemplate"
ref="jdbcTemplateID" />
</bean>
<bean id="jdbcTemplateID"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"
ref="dataSourceID" />
</bean>
- testen Sie die JDBC Persistenzanbindung mit entsprechenden Unit-Tests
11.4
Hibernate
- Open-Source-Persistenz- und ORM-Framework für Java www.hibernate.org
- speichert POJOs mit Attributen und Methoden in relationalen Datenbanken
- synchronisiert DB Relationen mit Objekten
Vorteile
- Abstraktion der verwendeten DB
- dadurch DB Unabhängigkeit
- nicht intrusiv
- keine Ableitung eigener Klassen von
Hibernate-Klassen erforderlich
- keine Voraussetzungen an
die Laufzeitumgebung
- verwendbar in managed und non-managed Umgebungen
- Generierung von sehr effizientem SQL
Nachteil
- exponentieller Komplexitätsgrad
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 86 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
11.4.1
Hibernatesession
der Hibernate Lebenszyklus basiert auf der Hibernatesession
- Transient
- mittels <new> erzeugt
- noch keinem Persistenzkontext zugeordnet
- keine Repräsentation innerhalb der Datenbank
- Pesistent
- besitzt entsprechende Repräsentation innerhalb der Datenbank
- Instanz ist einem Persistenzkontext zugeordnet
- wird von der HibernateSession verwaltet
- Detached
- hat eine Repräsentation innerhalb der Datenbank
- ist keinem Persistenzkontext zugeordnet
- infolge eines Commits geschlossen
- per Remote Aufruf in einer anderen VM
- Removed
- hat eine Repräsentation innerhalb der Datenbank
- ist einem Persistenz Kontext zugeordnet
- ist zum Löschen freigegeben
- Hibernate Session verwenden
public class VerlagDAO implements IVerlagDAO {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void insert(Verlag verlag) {
sessionFactory.getCurrentSession().save(verlag);
}
- Alternative ► HibernateTemplate verwenden
public class VerlagDAO extends HibernateDaoSupport implements IVerlagDAO {
public void insert(Verlag verlag) {
getHibernateTemplate().save(verlag);
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 87 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
Deklaration einer HibernateSession
<bean id="verlagDAO" class="module.spring.hibernate.xml.KundeDAO">
<property name="sessionFactory" ref="hibernateSessionFactory" />
</bean>
<bean id="hibernateSessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="mappingResources">
<list>
<value>module.spring.hibernate.xml.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
<property name="dataSource" ref="dataSource" />
</bean>
Deklaration des Hibernate Mapping hbm.xml
<hibernate-mapping auto-import="true">
<class name="module.spring.hibernate.xml.Verlag" table="verlag_table">
<id name="id" unsaved-value="0">
<generator class="native" />
</id>
<property name="name" />
<property name="plz" />
<property name="ort" />
</class>
</hibernate-mapping>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 88 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
ÜBUNG Hibernate
- Ergänzen Sie die Mappingeigenschaften der hbm.xml Datei
<!-- Persistente Attribute -->
<property name="name" />
- Implementieren Sie die Persistenzschicht mit Hibernate
- finder Methode, z.B. findByName(String name)
- Ansatz ► getHibernateTemplate() .find ("from Verlag v where v.name=?", name)
- distributive Aggregat Funktionen, z.B. count()
- mit der HibernateSession
- mit dem HibernateTemplate
public List<Verlag> findByName(String name) {
return ...
}
public long count() {
return ...
}
11.5
JPA
- spezifiziert durch JSR 220
- spezifiziert Persistenz Framework
- (Definition) aus Hibernate, TopLink und JDO entstanden
- nicht auf den Einsatz unter Java EE begrenzt
- lauffähig unter Java SE
- als normale Java Anwendungen
- ausserhalb eines Java EE Containers
- Darstellung der Entitäten durch POJOs (Plain old Java Objects)
- Definition der Metadaten durch Annotationen
- XML (Deployment) Deskriptor-Dateien zur Angabe der Metadaten als Alternative
- orm.xml (Deployment) Deskriptor-Dateien überschreiben Annotationen
Ziel
- Java EE zu vereinfachen
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 89 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
11.6
Persistenz Provider
JPA erfordert einen Persistenz Provider, dieser definiert
- Entity
- Java Repräsentation eines persistenten Datensatzes
- Entity Klasse
- serialisierbar / Default Konstruktor /private Attribute
- Getter / Setter Methoden
- Persistence Unit
- Beschreibung von Entity-Klassen
- Data-Source und entspechende Abbildungsinformationen
- Entity Manager
- JPA Standard Interface
- synchronisiert mit der Datenbank
- Persistenzkontext
- Menge aller Entitäten einer Transaktion
- First Level Cache
- Datenbank-Transaktion
- garantiert ACID Verhalten der Datenbank
Persistezp
Persistezprovider
JPA Standard
synchronisiert mit DB
Datenbank
Transaktion
Entity
Manager
garantiert ACID der DB
lädt / speichert
arbeitet
Objekt RepräsenRepräsentation eines Tupel
Entity
Instanz
POJO
- serialisierbar
- Default Konstruktor
- private Attribute
- getter / setter
assoziiert mit
Persistence
Context
umfasst
von
Menge aller
Entitäten einer
Transaktion
FirstFirst-LevelLevel-Cache
bezieht sich
Entity
Klasse
Persistence
Unit
umfasst
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 90 >> total: 160 Seiten
- Entityklassen
- Datasource
- Abbildungsinfos
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
11.6.1
Entities
- leichtgewichtige, persistente Objekte als POJOs
- zentraler Teil der Java Persistence API
-
abstrakte wie auch konkrete Java-Klassen werden verwendet
Vererbung, polymorphe Assoziationen und polymorphe Abfragen sind unterstützt
nicht von einer bestimmten Basisklasse abgeleitet
eigene Vererbungshierarchie kann verwendet werden
- Bedingungen
-
muss einen parameterlosen Konstruktor enthalten public oder protected
muss eine Top-Level-Klasse sein nicht final
Methoden oder persistente Attribute dürfen nicht final sein
implementiert Serializable falls Instanzen "by-value" übertragen werden sollen
muss einen Primärschlüssel enthalten
- Deklaration
- mit Annotation @Entity
- per XML orm.xml
Deklaration einer Entity mit Annotations
- entweder Markierung der Klassenattribute
- oder Markierung der Getter-Methoden
@Entity
@Table(name="verlag_table")
public class Verlag implements Serializable {
@Id @GeneratedValue private long
id;
private String name;
private int
plz;
private String ort;
public Verlag() {
}
// Relationen in Beziehung stehende Entities
// getter und setter
// hashcode und equals überschreiben
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 91 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
Deklaration einer Entity per orm.xml
-
Schemadefinitionen Tabellenname, Spaltennamen, etc.
Relationen One:One, One:Many, Many:One, Many:Many
Vererbungsstrategien Single Table, Table per Class, Joined
Ladestrategien Objekte, Attribute
Generatorstrategien für den Primarykey Sequence, Table, Hi-Lo Algorithm, etc.
</entity-mappings>
<entity class="Verlag">
<table name="verlag_table" />
<attributes>
<id name="id">
<generated-value strategy="AUTO" />
</id>
<basic name="name" />
<basic name="ort" />
</attributes>
</entity>
</entity-mappings>
11.6.2
Persistenzunit
- erzeugt EntityManager Factory
- definiert durch persistence.xml
Defini
Definition der
der Persistenzunit
Persistenzunit
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="Spring">
<jta-data-source>java:jdbc/spring</jta-data-source>
<properties> <!-- ddl Data Definition Language -->
<property name="hibernate.hbm2ddl.auto"
value="create-drop" />
</properties>
</persistence-unit>
</persistence>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 92 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
11.6.3
Entitymanager
- verwaltet die Entities
- ist genau einem Persistenzkontext zugeordnet
- Container-Managed Entity Manager
- Application-Managed Entity Manager
ContainerContainer-Managed Entity Manager
- innerhalb eines Java EE Containers
- erzeugt und schliesst den Entity Managers
- verwaltet JTA (Java Transaction API) Transaktionen
- definiert durch Dependency Injection
- JNDI Java Naming and Directory Interface
ApplicationApplication-Managed Entity Manager
- wird von der Anwendung selbst verwaltet
- aus EntityManagerFactory
- Transaktionen durch
- JTA (Java Transaction API) Spring durch AOP
- lokale Transaktion (z. B. JDBC Transaktion)
Methoden der EntityManager API (Ausschnitt)
public void persist(Object entity);
- Übergang zu managed Entity Instanz:
- commit() oder flush() persistiert Objekt in der Datensource
- ist entity eine neue Entity, wird diese zur managed Entity
- ist entity eine removed Entity, wird diese zur managed Entity
- ist entity eine detached Entity, wird eine IllegalArgumentException geworfen
- gilt auch für relationale Felder von entity, die mit CascadeType.PERSIST annotiert sind
public void remove(Object entity);
- Übergang zu removed Entity Instanz
- commit() oder flush() löscht Objekt in der Datensource
- ist entity eine neue Entity, so wird nichts geschehen
- ist entity eine bestehende managed Entity, so wird diese gelöscht
- ist entity eine detached Entity, wird eine IllegalArgumentException geworfen
- gilt auch für relationale Felder von entity, die mit CascadeType.REMOVE annotiert sind
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 93 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
public void refresh(Object entity);
- synchronisiert die Entity Instanz mit der Datensource
- Änderungen innerhalb der Entity werden dabei überschrieben
-
ist entity eine neue Entity, wird eine IllegalArgumentException geworfen
ist entity eine bestehende managed Entity, so wird diese mit der Datensource synchronisiert
ist entity eine removed Entity, wird eine IllegalArgumentException geworfen
ist entity eine detached Entity, wird eine IllegalArgumentException geworfen
gilt auch für relationale Felder von entity, die mit CascadeType.REFRESH annotiert sind
public <T> T merge(Object entity);
- Übergang von einer detached Entity zu einer managed Entity Instanz
- ist entity eine detached Entity, wird diese in die existierende managed Instanz von entity kopiert
- oder eine neue Kopie einer managed entity Instanz erstellt
- ist entity eine neue Entity, so wird eine neue managed Instanz entity* als Kopie erstellt
- ist entity eine removed Entity, wird eine IllegalArgumentException geworfen
- gilt auch für relationale Felder von entity, die mit CascadeType.MERGE annotiert sind
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 94 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
public void lock(Object entity, LockModeType mode);
- sperrt die Entity Instanz
- LockModeType.READ
- andere Transaktionen können das Objekt lesen, aber nicht ändern
- LockModeType.WRITE
- andere Transaktionen können das Objekt weder lesen noch schreiben
public <T> T find(Class<T> entity, Object primaryKey);
- sucht ein Objekt
- lädt entity aus Datenbank identifiziert durch Primärschlüssel
- liefert null falls keine Entity gefunden wurde
public <T> T getReference(Class<T> entity, Object primaryKey);
- lädt ein Proxy (bzw. eine Referenz) einer Entity
- identifiziert durch Primärschlüssel
- übrige Felder der Entity können zu einem späteren Zeitpunkt nachgeladen werden
- sinnvoll, wenn entity referenziert wird, ohne deren Inhalt zu laden
public void detach(Object entity);
- Übergang zu einer detached Entity Instanz
-
ist entity eine bestehende managed Entity so wird diese zu einer detached Entity
ist entity eine detached Entity so wird nichts geschehen
gilt auch für relationale Felder von entity die mit CascadeType.DETACH annotiert sind
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 95 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
11.6.4
Persistenzkontext
- Menge aller Entitäten einer Transaktion
- Use Case
- Cache
- First Level Cache definiert durch Framework z.B. Hibernate
@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class Verlag extends BusinessObject{ ...
- Second Level Cache als fremde APIs JPA 2.0 Cache APIs
Second Level Cache provider
Cache Provider
Read-Only
Read-Write
Nonstrict R-W
Transactional
EHCache
OSCache ► Opensymphony
Opensymphony
JBossCache ► JBoss
- Gültigkeitsdauer
- transaction-scoped
- entspricht der Dauer einer Transaktion
- nach Abschluss der Transaktion wird der Persistenzkontext geschlossen
- extended
- ist unabhängig von einer Transaktion
- kann mehrere Transaktionen umfassen
- der Persistenzkontext muss manuell (Entity Manager) geschlossen werden
// emf = EntityManagerFactory ist Application Managed
EntityManager em = emf.createEntityManager();
// Transaktion starten (begin) und beenden (commit)
em.getTransaction().begin();
Verlag myVerlag = em.find(Verlag.class, new Long(1));
myVerlag.setName("dpunkt.verlag");
Verlag mySecondVerlag = new Verlag();
mySecondVerlag.setId(2);
mySecondVerlag.setName("entwickler.press");
em.persist(mySecondVerlag);
em.getTransaction().commit();
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 96 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
11.7
Lebenszyklus
- der Persistence Provider verwaltet die Zustände eines persistenten Objektes transparent
- JPA definiert transparentes O/R-Mapping Framework
- Entities ist ihr eigener Zustand nicht bekannt
- es ist nicht direkt möglich, eine Entity nach ihrem aktuellen Zustand zu fragen
Objektzustände
Objektzustände
eine Entity definiert vier verschiedene Zustände
- New
- neue Entity vorübergehend, flüchtig
- Removed
- gelöschte Relation gelöscht
- Persistent
- synchronisierte Relation persistent, nicht flüchtig
- Detached
- unsynchronisierte Relation gelöst
new()
Entity
Lifecycle
garbage
New
remove()
garbage
refresh()
persist()
find()
getReference()
Removed
refresh()
merge()**
getResultList()
getSingleResult()
persist()
remove()
Managed
- JPA Objekt Zustandsdiagramm
persist()
refresh()
merge()
- Zustandsänderung durch
Operationen des Persistenzkontext
- Methoden der EntityManager-Instanz
- Methoden der Query-Instanz
refresh()
merge()
detach()
close()*
clear()*
lock()
merge()**
Detached
* betrifft alle Instanzen des Persistenzkontext
** erzeugt persistente Instanz, Originalobjekt bleibt erhalten
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 97 >> total: 160 Seiten
garbage
persist()
remove()
refresh()
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
New
-
durch new erzeugtes Entity-Objekt als normales Java-Objekt POJO
keine Verbindung zwischen der Entity und Entity Manager
Zustand der Entity nicht persistent abgespeichert
Garbage Collector entsorgt Objekte ohne Referenz
keine Repräsentation der Entity innerhalb der Datenbank
alle Daten der Entity sind flüchtig und gehen verloren (Garbage Collector)
Entities sind transient, nicht Teil einer Transaktion
Rollback nicht anwendbar (in Transaktion)
Primärschlüsselfelder, durch den Persistenz-Manger erzeugt, sind noch nicht gesetzt
Übergang von New zu Managed mit:
- persist()
- merge()
- Referenzierung durch persistente Entity
- abhängig von Kaskadierungseinstellungen der Assoziation
Managed
-
Entity wird von einem Entity Manager verwaltet
Entity hat einen Primärschlüssel zugewiesen
(auch ohne) Repräsentation innerhalb der Datenbank
persist() veranlasst keine Datenbankaufrufe
Entities im persistenten Zustand sind Teil einer Transaktion
Änderungen können durch Rollback rückgängig gemacht werden
Änderung von Attributen wird erkannt
- SQL UPDATE
- SQL INSERT
- find() – erzeugt persistente Entity
- ohne Übergang von New nach Managed
Übergang von Managed zu Removed:
- remove()
remove() löscht die Daten der Entity innerhalb der Datenbank,
JavaJava-Objekt bleibt verfügbar, vorausgesetzt,
vorausgesetzt, es wird noch referenziert
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 98 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
Detached
Detached
-
schliessen des Managers mit close(...)
Zuordnung der Entities zum Manager endet
Entities sind nicht mehr Teil einer Transaktion
Änderungen werden nicht mehr mit Datenbank synchronisiert
Java-Objekte enthalten trotzdem (veraltete) persistente Daten
durch Serialisieren (und Übertragen) einer Entity in einen anderen Prozess
- Transferieren des POJO in eine Remote-Anwendung Client-Request
- als Transfer-Objekte zwischen Präsentationsschicht und Datenbankschicht
Übergang von Detached zu Managed:
- merge()
- Kopie der Entity wird wieder in Persistenzkontext aufgenommen
- lock()
- unveränderte Entity wird wieder in Persistenzkontext aufgenommen
- Parameter lockMode definiert verschiedene Lock-Modi in Verbindung mit Transaktionen
Removed
- Entity-Objekt für das Löschen markiert
- wird am Ende der laufenden Transaktion gelöscht
- z.B. mit flush()
- kann wieder in den managed Zustand aufgenommen werden
- mit persist()
Übergang von Removed zu Managed mit
- persist()
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 99 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
ÜBUNG JPA
Implementieren Sie die Persistenzschicht mit JPA
- EntityManager durch den PersistenceContext JSR 220
@PersistenceContext(name="spring")
private EntityManager em;
- EntityManger durch das JpaTemplate durch Ableiten von JpaDaoSupport
public class VerlagDAO extends JpaDaoSupport implements IVerlagDAO {
public List getByName(String name) {
return getJpaTemplate().find("FROM Verlag v WHERE v.name=?1", name);
}
ÜBUNG JPA (annotiert)
- definieren Sie die Verlags Entity durch JPA Annotationen
@Entity
@Table(name="t_verlag")
public class Verlag implements Serializable{
@Id
@GeneratedValue
private long
id;
private String name;
private int
plz;
private String ort;
...
- laden Sie die Konfigurationen als Spring Beans
<context:property-placeholder location="jdbc.properties" />
<context:component-scan base-package="module.spring.jpa.annotation" />
<bean class="module.spring.jpa.annotation.VerlagDao" />
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 100 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
- definieren Sie die Bean-Konfigurationen
@Configuration
public class BeanConfiguration {
@Value("${driver}")
private String
@Value("${url}")
private String
@Value("${user}")
private String
@Value("${password}") private String
driver;
url;
user;
password;
@Bean(destroyMethod = "close") protected DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(driver);
...
return dataSource;
}
@Bean protected EntityManagerFactory entityManagerFactory() { ... }
@Bean public JpaVendorAdapter jpaVendorAdapter() { ... }
@Bean public PlatformTransactionManager transactionManager() { ... }
@Bean public IVerlagDao verlagDAO() { return new VerlagDao(); }
11.8
Datenbank Exceptions
Spring verwendet eine eigene Exception Hierarchie und mappt die DB Exceptions
- unabhängig von der verwendeten API
- Abstaktion der DB
Unterklassen der DataAccessException
Callback
Beschreibung
ConcurrencyFailureException
Ausnahmen bei parallelen DB Zugriffen
DataAccessResourceFailureEx
DataAccessResourceFailureException
Ausnahmen beim Zugriff auf DB Rescourcen
DataRetrievalException
Ausnahmen beim Lesen von Daten
InvalidDataAccessResourceUsageException
InvalidDataAccessResourceUsageException Ausnahmen bei falscher Query Syntax
try { ...
} catch (EmptyResultDataAccessException ex) {
return null;
// definiert Unabhängikkeit der Persitenzschicht
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 101 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
ÜBUNG Datenbank Exception
- mappen Sie die DB Exception auf eine (sinnvolle) Spring Exception
public Verlag getByID(int id) {
try {
return (Verlag) getNamedParameterJdbcTemplate().queryForObject(
"SELECT NAME, FROM VERLAG V WHERE ID=:id",
new MapSqlParameterSource("id", id), new VerlagRowMapper());
} catch (EmptyResultDataAccessException ex) {
return null;
}
}
J
Transaktionen
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 102 >> total: 160 Seiten
Spring 3 >> Java Framework >> ORM Object-Relation-Mapping
Lerninhalte
Transaktions-Steuerung
Transaktions-Management
Transaktions-Eigenschaften
Transaktions-Annotationen
12
Transaktionsmanagement
wiki
Als Transaktion (von lat. trans „über“, actio
actio zu agere „(durch)führen“) bezeichnet man
in der Informatik eine Folge von Operationen, die als eine logische Einheit betrachtet
werden. Insbesondere wird für Transaktionen gefordert, dass sie entweder vollständig
oder überhaupt nicht ausgeführt werden (A
(Atomarität).
tomarität). Transaktionen werden von
Transaktionssystemen verarbeitet; diese erzeugen dabei aus mehreren Transaktionen
eine Historie. Transaktionen kommen meist bei Datenbanksystemen zum Einsatz.
12.1
-
Transaktion
logisch zusammenhängende Folge von Operationen einer Datenbank
wird von einem konsistenten in einen weiteren konsistenten Zustand überführt
kleinster, unteilbar abzuarbeitender Prozess einer Anwendung
werden vollständig oder gar nicht abgearbeitet
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 103 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
12.1.1
Transaktionskonzepte
- ACID-Eigenschaften
- Atomic (atomar) ► eher Up-Quark, Neutrino oder Myon, etc.
- eine Transaktion ist Reihe von "primitiven" unteilbaren Operationen
- es werden entweder alle Operationen ausgeführt oder gar keine
- Consistent (konsistent)
- Transaktionen hinterlassen die Datenbank in einem konsistenten Zustand
- Isolated (isoliert)
- gleichzeitige Transaktionen beeinflussen sich nicht
- Durable (dauerhaft)
- abgeschlossene Transaktionen sind dauerhaft
12.1.2
Transaktionsverhalten
- commit
- erfolgreiche Beendigung einer Transaktion
- die Änderungen sind dauerhaft in der Datenbank abgespeichert
- für alle (User) sichtbar
- rollback
- Transaktionsabbruch führt Änderungen am Datenbestand zum letzten konsistenten Zustand
12.1.3
Lokale und verteilte Transaktionen
- lokale Transaktion (local transaction)
- nur lokale Daten betroffen
- nicht mehrere (Daten)-Ressourcen sind Teil der Transaktion
- verteilte Transaktion (distributed transaction)
- betreffen mehrere Daten, die auf Verteilten Systemen liegen
- müssen in Teiltransaktionen aufgeteilt werden
Transaktionsablauf
-
Business Prozess startet Transaktion 1
Business Prozess startet Transaktion 2
Transaktion 1 wird mit commit beendet
Transaktion 2 wird mit commit beendet
► inkonsistente Zustände sind möglich
- zweite Commit-Anweisung fällt aus
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 104 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
Zwei Phasen Commit
2PC definiert erweitertes Protokoll mit 2 Phasen
- Erste Phase
- "Prepare-to-Commit" auf allen Knoten
- teure Operation
- Zweite Phase
- sendet ein Commit an die Knoten
- billige Operation
12.1.4 Isolationsebenen
wiki
In der Informatik bezeichnet der Begriff Isolation die Trennung von Transaktionen auf
eine Weise, dass eine laufende Transaktion nicht von einer parallel ablaufenden
ablaufenden
Transaktion durch Änderung der benutzten Daten in einen undefinierten Zustand
gebracht werden kann. Die Isolation ist eine der vier ACIDACID-Eigenschaften.
- komplette Serialisierung der transaktionalen Operationen
- sicher, aber teuer
- Isolierung ist eine Einschränkung im Vergleich zu idealen ACID Transaktionen
- nach ANSI-92 SQL
Isolationsebenen
Level
Beschreibung
NONE
keine Transaktion möglich
READ_UNCOMMITTED alle Transaktionen sehen die Änderungen von anderen Transaktionen
READ_COMMITTED
nicht abgeschlossene Transaktionen sind unsichtbar für andere Transaktionen
REPEATABLE_READ
eine Transaktion sieht nur Daten, die vor ihrem Startzeitpunkt vorhanden waren
SERIALIZABLE
alle Transaktionen verhalten sich, als würden sie hintereinander abgearbeitet
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 105 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
12.1.5
Probleme bei parallelen Datenbankoperationen
- Multi-User Applikationen definieren folgende Problem-Szenarien
Dirty Read
-
innerhalb einer Transaktion T1 wird ein Datensatz Z verändert
dieser veränderte Datensatz wird innerhalb einer zweiten Transaktion T2 gelesen
Transaktion T1 mit einem Rollback abgebrochen
die Transaktion T2 arbeitet mit einem ungültigen Wert
- Dirty Read
dirty read
User T1
Daten Z
User T2
1
10
Transaktionsablauf
2
3
4
UPDATE
ROLLBACK
11
11
10
SELECT
5
10
SELECT
Non Repeatable Read
-
innerhalb einer Transaktion T1 wird ein Datensatz Z gelesen
die zweite Transaktion T2 ändert diesen Datensatz Z
die Transaktion T2 wird commited
erneutes Lesen von Z durch die Transaktion T1 ergibt einem ungültigen Wert
- Non-Repeatable Read
nonrepeatable
read
User T1
Daten Z
User T2
Transaktionsablauf
1
2
10
SELECT
10
3
11
UPDATE
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 106 >> total: 160 Seiten
4
11
COMMIT
5
SELECT
11
Spring 3 >> Java Framework >> Transaktionsmanagement
Phantom Read
-
die Transaktion T1 liest die Ergebnismenge der Daten Z (count = 2)
die Transaktion T2 verändert die Anzahl Datensätze mit Insert / Delete
die Transaktion T2 wird committed
erneutes Lesen von Z durch die Transaktion T1 ergibt eine ungültige Ergebnismenge
- Phantom Read
phantom
read
User T1
Daten Z
User T2
1
10,11
Transaktionsablauf
2
3
4
SELECT
10,11
11,11,12 11,11,12
INSERT
COMMIT
5
SELECT
10,11,12
Lost Update
Update
-
innerhalb einer Transaktion T1 wird ein Datensatz Z gelesen
die zweite Transaktion T2 liest denselben Datensatz Z
die Transaktion T1 wird commited
die Transaktion T2 wird commited
erneutes Lesen von Z durch die Transaktion T1 ergibt einem ungültigen Wert
- Lost Update
lost
update
Transaktionsablauf
1
User T1
SELECT
Daten Z
10
User T2
2
3
4
COMMIT
10
11
SELECT
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 107 >> total: 160 Seiten
5
SELECT
12
COMMIT
12
Spring 3 >> Java Framework >> Transaktionsmanagement
mögliche Vorkommen bei Isolationsebenen
Isolationsebenen
mögliche Reads
Isolationsebene
Dirty Read
Non Repeatable Read
Phantom Read
Read
Read Uncommitted
Read Committed
Repeatable Read
Serializable
- mit zunehmendem Isolationsgrad
- sicherere Transaktion
- schlechtere Performance, da mehr Sperren innerhalb der Datenbank
12.2
Transaktionssteuerung
- Transaktion ist im Code versteckter Aspekt
- Spring abstrahiert den Kontakt mit dem Transaktionsmanagement
- Spring selbst bietet keinen Transaktionsdienst an
- Spring versucht bestehende Technologien bestmöglich zu integrieren
programmatisches Transaktionsmanagement
- Beanlogik steuert / überwacht Transaktionsbalauf
transactionManager.rollback(transactionStatus);
deklaratives Transaktionsmanagement
- Springcontainer steuert / überwacht Transaktionsablauf
<tx:advice id="txAdvice" transaction-manager="transactionManager">
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 108 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
Transaktionsmanager
Transaktionsmanager
- dient als Fassade zu einer spezifischen Implementierung
wiki
Facade Pattern definiert eine einheitliche Schnittstelle zu einer Menge von
Schnittstellen eines Subsystems. Die Facadenklasse definiert eine abstrakte
Schnittstelle, welche die Benutzung
Benutzung des Subsystems vereinfacht.
Spring Transaktionsmanagment
TransactionManager
Beschreibung
DataSourceTransactionManager
verwaltet Transaktionen von einfachen JDBC Verbindungen
HibernateTransactionManager
verwaltet Transaktionen mit Hibernate als Persistenzmechanismus
JdoTransactionManager
verwaltet Transaktionen mit JDO als Persistenzmechanismus
TopLinkTransactionManager
verwaltet Transaktionen mit TopLink als Persistenzmechanismus
PersistenceBrokerTransactionManager
verwaltet Transaktionen mit ORM
JmsTransactionManager
verwaltet Transaktionen mit JMS für asynchrone Kommnikation
12.2.1
TransactionManager per XML
- als AOP Aspekt
- Interceptor fängt Methodenaufrufe ab
- Interceptor startet / beendet Transaktionen
- Konfiguration über TransactionAttributeSource
JDBC (Java Database Connectivity)
Connectivity)
- Unterstützung durch Connection Objekt
<bean id="txManager" class="...jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="order*" propagation="REQUIRED" rollback-for="OrderException" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor pointcut="execution(* module.spring.jdbc.xml.Facade.*(..))"
advice-ref="txAdvice" />
</aop:config>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 109 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
ORM Framework (Object(Object-RelationRelation-Mapping)
- Unterstützung durch eigene Transaktionsmanager
- 1st und 2nd Level Cache Unterstützung
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="hibernateSessionFactory" />
</bean>
<bean id="hibernateSessionFactory"
class=" org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="mappingResources">
<list>
<value>module.spring.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MYSQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
<property name="dataSource" ref="dataSource" />
</bean>
JMS
JMS (Java Messaging Services) für asynchrone Kommunikationsmodelle
- Gruppieren von JMS Messages
<!-- jms TX manager -->
<bean id="jmsTransactionManager"
class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="jmsConnectionFactory"/>
</bean>
<!-- activemq component -->
<bean id="activemq" class="org.apache.activemq.comand.ActiveMQQueue">
<property name="connectionFactory" ref="jmsConnectionFactory"/>
<!-- define the jms consumer/producer as transacted -->
<property name="transacted" value="true"/>
<property name="transactionManager" ref="jmsTransactionManager"/>
</bean>
<!-- connection factory -->
<bean id="jmsConnectionFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value=" tcp://localhost:61616 "/>
</bean>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 110 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
JPA (Java Persistence API)
API)
- definiert durch Spezifikation
- JSR 220 ► Enterprise JavaBeans 3.0
- JSR 317 / 318 ► Java Persistence API 2.0 / Enterprise JavaBeans 3.1
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="entityManagerFactory"
class="...orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="spring" />
<property name="jpaVendorAdapter">
<bean class="...orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="database">
<util:constant static-field="...orm.jpa.vendor.Database.MYSQL" />
</property>
</bean>
</property>
</bean>
JTA (Java Transaction API) für distributed Transaktionssysteme
- Unterstützung durch Applikations-Server, Messaging-System, etc.
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager" />
<jms:listener-container connection-factory="myConnectionFactory"
task-executor="myTaskExecutor"
destination-resolver="myDestinationResolver"
transaction-manager="myTransactionManager"
concurrency="10">
<jms:listener destination="queue.confirmations"
ref="confirmationLogger" method="log" />
</jms:listener-container>
12.2.2
TransactionManager per Annotation
@Resource
UserTransaction userTransaction;
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 111 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
12.3
Transaktionsmanagement
programmatisches
programmatisches Transaktionsmanagement
- logische Kontrolle über Transaktionsverhalten
- nicht effizient
- Unabhängigkeit (Technologie) geht verloren
- codeabhängig
public void addVerlag() {
transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus ts) {
try {
// Verlag anlegen und Medien dem Verlag hinzufügen
} catch (Exception e) {
ts.setRollbackOnly();
}
return null;
}
}
}
deklaratives
deklaratives Transaktionsmanagement
- AOP Transaktionen
- Transaktionsmanagement als Aspekt
- persistenzabhängiger TransactionManager als Advice
- Transaktionseigenschaften als Pointcut auf bestimmte Methoden von Beans
- Spring übernimmt die Verantwortung des Transaktionsmanagement
- (Neu-) Starten und Weiterführen einer Transaktion
<tx:advice id="txAdvice" transaction-manager="jpaTransactionManager">
<tx:attributes>
<tx:method name="add*" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor pointcut="execution(* *.ServiceFacade.*(..))"
advice-ref="txAdvice" />
</aop:config>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 112 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
TX Namespace
Element
Beschreibung
<tx:advice>
deklariert Transaktionsadvice
<tx:annotation-driven>
erwartet @Transactional Annotation
<tx:attribute>
deklariert Transaktionsregeln
<tx:jta-transaction-manager>
konfiguriert JTA Transaktionsmanager ► JPA
<tx:methode>
deklariert Transaktionsregel für Methodensignatur
- TX Namespace erfordert XSD Schema
<beans xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
annotiertes
annotiertes Transaktionsmanagement
- annotierter Spring Aspect
@Transactional(propagation = Propagation.REQUIRED,
rollbackFor = VerlagException.class)
public void exceptionTx(Verlag verlag) throws VerlagException {
verlagDAO.insert(verlag);
throw new VerlagException("Erwartete Test-Exception");
}
- Transaktionsmanager als UserTransaction
- im Einsatz mit JEE Server
- unabhängig von Technologie
@Resource
UserTransaction userTransaction;
// Dependency Injection (JSR-250)
TX Annotations
Annotation
Beschreibung
@Transactional
deklariert Transaktionsgrenze und Transaktionsregeln
Einsatz
Method, Type
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 113 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
12.4
PlatformTransactionManager
- bietet implementationsunabhängige Schnittstelle
- Abstraktion zum Persistenzmechanismus
- definiert Unabhängigkeit
- von Transaktionsmanager
- jedoch nicht von Spring!
- unterstützt 2PC Protokoll ► distributed Transaktion
public interface PlattformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
Um transaktionsfähig zu sein,
sein, muss Spring
Spring die Persistenz kontrollieren !
Nutzung des PlatformTransactionManager
- erster Aufruf an das API startet Transaktion
- erzeugt TransactionStatus
- kann durch den Code manipuliert werden
- wird nach Beenden dem PlatformTransactionManager übergeben
- beendet die Transaktion mit commit oder rollback
private PlatformTransactionManager tm;
// per Dependency Injection
public void setTransactionManager(PlatformTransactionManager tm) {
this.tm = tm;
}
public void cannotInsertVerlag(Verlag verlag) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus ts = tm.getTransaction(def);
verlagDAO.insert(verlag);
tm.rollback(ts);
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 114 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
12.5
Transaktionseigenschaften
Transaktionsregeln für ein AOP Pointcut ► Methode
- Propagation
- Isolationslevel
- Read-only
- Transaktionstimeout
Transaktionsattribute definieren
Transaktionsattribute
Attribut
Zweck
isolation
definiert die Isolationsebene
no-rollback-for
legt Exceptions fest, die kein Rollback zur Folge haben
propagation
definiert die Propagationsregeln für die Transaktion
read-only
legt fest, dass eine Transaktion nur liest und nicht schreibt
rollback-for
legt Exceptions fest, die ein Rollback zur Folge haben
Timeout
definiert Timeout für eine länger dauernde Transaktion
Propagation
wiki
Unter Propagation oder Propagierung (von Lateinisch propagare „ausdehnen“)
versteht man im weitesten Sinne eine Ausdehnung.
Ausdehnung.
Propagations in Spring
Bezeichnung
Verhalten
PROPAGATION_MANDATORY
erfordert eine laufende Transaktion ► Exception
PROPAGATION_NESTED
erfordert eine eigenständige Transaktion
PROPAGATION_NEVER
erlaubt keine offene Transaktion ► Exception
PROPAGATION_NOT_SUPPORTED
unterbricht eine offene Transaktion
PROPAGATION_REQUIRED
startet eine neue oder übernimmt eine bestehende Transaktion
PROPAGATION_REQUIRES_NEW
startet eine neue Transaktion
PROPAGATION_SUPPORTS
übernimmt eine geöffnete Transaktion
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 115 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
Transaktionspropagation
Bezeichnung
aufrufende Methode
NotSupported, Supports, Never
Required, RequiresNew
Mandatory
NotSupported
Supports, Required, Mandatory
RequiresNew, Nested
Never
weiterführende Methode
12.6
Spring Transaktion als AOP Aspekt - Zusammenfassung
- Spring Transaktion ist AOP Aspekt
- Transaktionssteuerung erfolgt als AOP Proxy
- durch TransactionInterceptor
- und entsprechenden PlatformTransactionManager
- transaktionaler Advice ist über Meta-Data definiert
- deklarativ
- annotiert
- erfolgt über Method-Invocation als Pointcut
AOP delegiert Calleraufruf an Proxy Object
AOP startet Transaktion
AOP beendet Transaktion (commit / rollback)
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 116 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
ÜBUNG JDBC Transaktion per XML Deklaration
- die Deklaration des TransactionManager benötigt
- Target ► txFacade
- Transaktionsmanager ► txManager
- Transaktionseigenschaften ► txAdvice
<bean id="txFacade" class="module.spring.jdbc.xml.TxFacadeImpl">
<property name="verlagDAO" ref="verlagID" />
<property name="transactionManager" ref="txManager" />
</bean>
<bean id="txManager" class="...jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor pointcut="execution(* *.TxFacadeImpl.*(..))" advice-ref="txAdvice" />
</aop:config>
ÜBUNG User JDBC Transaktion per PlatformTransactionManager
- provozieren Sie einen Rollback
public void rollbackTx(Verlag verlag) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus ts = tm.getTransaction(def);
verlagDAO.insert(verlag);
ts.setRollbackOnly();
}
- notwendige XML Deklaration
<!-- Transaction Facade -->
<bean id="txFacade" class="module.spring.jdbc.xml.TxFacadeImpl">
<property name="verlagDAO" ref="verlagID" />
<property name="transactionManager" ref="txManager" />
</bean>
<!-- Transaction Manager -->
<bean id="txManager" class="...jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 117 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
ÜBUNG annotierte JPA Transaktion
- annotieren Sie die Transaktionen für einen JPA Transaktionsmanager
@Transactional
public void insertTx(Verlag verlag) {
...
}
@Transactional(propagation = Propagation.REQUIRED)
public void rollbackTx(Verlag verlag) {
...
if (null != TransactionAspectSupport.currentTransactionStatus())
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
@Transactional(propagation = Propagation.REQUIRED,
rollbackFor = VerlagException.class)
public void exceptionTx(Verlag verlag) {
if (...){
verlagDAO.insert(verlag);
} else throw new RuntimeException("Erwartete Test-Exception"); }
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 118 >> total: 160 Seiten
Spring 3 >> Java Framework >> Transaktionsmanagement
K
Messaging
Lerninhalte
JMS API
Spring Messaging
ListenerKontainer
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 119 >> total: 160 Seiten
Spring 3 >> Java Framework >> Messaging
13
Messaging
- unterstützt asynchrone Kommunkationsmodelle
- Point-To-Point ► Queue
- Publish / Subscribe ► Topic
- unterstützt Entkoppelung
- Verteilungsaspekt
13.1
JMS API Java Messaging Service
- API für den Zugang zu Messaging-Systemen
- definiert Schnittstelle
- als Factory
- Message als
- Text
- Bytes
- Streams
- Objects
- Maps
synchron
P1
P2
asynchron
P1
P2
BROKER
Nachrichten erzeugen mit
mit der JMS API
Das Erzeugen und Absenden einer Nachricht über JMS erfolgt in sechs Schritten:
1.
Treiber lokalisieren
2.
Verbindung erzeugen
3.
Session erzeugen
4.
Destination lokalisieren
5.
Consumers
oder
Producers
erzeugen
6.
Nachricht senden
oder
Nachricht empfangen
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 120 >> total: 160 Seiten
Spring 3 >> Java Framework >> Messaging
Lokalisieren des JMSJMS-Treibers
- Treiber für das verwendete JMS-Produkt laden ► Maven
- lookup(CONNECTION_FACTORY)
- CONNECTION_FACTORY ist JNDI-Name des Treibers
- implementiert die Schnittstelle ConnectionFactory
Erzeugen der JMSJMS-Verbindung
Verbindung
- aktive Verbindung zu einem JMS-Provider erzeugen
- kapselt die Netzwerk-Kommunikation
- Analog zu JDBC wird der Treiber verwendet, um eine Connection anzufordern
- TopicConnection
- QueueConnection
Erzeugen einer JMS Session
Session
- JMS Session ist ein Hilfsobjekt, um Nachrichten zu senden oder zu empfangen
- legt die Eigenschaften des Nachrichtenaustauschs fest
- integriert den Nachrichtenaustausch in eine Transaktion
- TopicSession
- QueueSession
Lokalisieren einer JMS Destination
Destination
- JMS Destination ist ein Kommunikationskanal
- sendet Nachrichten
- empfängt Nachrichten
- die Auswahl des Kanals erfolgt über ein lookup(CHANNEL)
- CHANNEL ist JNDI-Name des Kanals
- wird meist durch Applikationserver zur Verfügung gestellt
Erzeugen eines JMS Consumers oder eines JMS Producers
Producers
- Empfänger oder Sender
Senden oder Empfangen der Nachricht
- Typen von Nachrichten
- Text, Bytes, Streams, Objects oder Maps
- Nachricht wird instantiiert
- Nachricht wird über den Producer gesendet
- Nachricht wird über den Consumer empfangen
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 121 >> total: 160 Seiten
Spring 3 >> Java Framework >> Messaging
jedes Interface hat zwei Ausprägungen,
Ausprägungen, analog zu den
den beiden Kommunikationsmodellen
JMS API
Interface
PointPublishPoint-ToTo-Point
Publish-Subscribe
Subscribe
ConnectionFactory
QueueConnectionFactory
TopicConnectionFactory
Connection
Queue Connection
TopicConnection
Destination
Queue
Topic
Session
QueueSession
TopicSession
MessageProducer
QueueSender
TopicPublisher
MessageConsumer
QueueReceiver, -Browser
TopicSubscriber
13.2
JMS in Spring implementiert
- Spring offeriert Template zur Integration
- JmsTemplate
- JmsTemplate02
►für JMS 1.1
► für JMS 1.2
JMSTemplate / ConnectionFactory
// Apache ActiveMQ ► http://activemq.apache.org/
<bean id="connectionFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="closeTimeout" value="100" />
<property name="brokerURL" value="tcp://localhost:61616" />
</bean>
<bean id="jmsTemplate"
class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="defaultDestinationName" value="..." />
<property name="messageConverter">
<bean class="...jms.support.converter.SimpleMessageConverter"/>
</property>
</bean>
13.3
Nachricht senden
durch MessageCreato
MessageCreator Intefac
Inteface
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 122 >> total: 160 Seiten
Spring 3 >> Java Framework >> Messaging
jmsTemplate.send(destination, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage textMessage = session.createTextMessage();
textMessage.setText("send this as a message");
return textMessage;
}});
durch MessageConverter Interface
jmsTemplate.convertAndSend("send one more message");
Messageh
Messageheader definieren durch MessagePostProcessor
jmsTemplate.convertAndSend( msg, new MessagePostProcessor() {
public Message postProcessMessage(Message msg) throws JMSException {
msg.setIntProperty("MessageID", 1234);
return message;
}});
13.4
Nachricht empfangen
- durch Methode jmsTemplate.receive()
- durch Methode jmsTemplate.receiveAndConvert() ► als konfigurierbares Object
MessageListener ► ruft die Methode onMessage() auf
public class MyMessageListener implements SessionAwareMessageListener {
public void onMessage(Message message, Session session) throws JMSException {
synchronized (MyMessageListener.class) { MyMessageListener.class.notifyAll();}
}
<bean id="messageListener" class="module.spring.jms.xml.MyMessageListener" />
<bean class="org.springframework.jms.listener.SimpleMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="queue" />
<property name="messageListener" ref="messageListener" />
</bean>
<bean id="queue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="myqueue" />
</bean>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 123 >> total: 160 Seiten
Spring 3 >> Java Framework >> Messaging
Recei
ReceiverAdapter
- delegiert Messages an die Receiverklasse ► MessageReceiver
- definiert die Listener Methode ►logMessage
<bean class="org.springframework.jms.listener.SimpleMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="queue" />
<property name="messageListener" ref="recieverAdapter" />
</bean>
<bean id="receiverAdapter" class="...jms.listener.adapter.MessageListenerAdapter">
<property name="delegate" ref="receiver" />
<property name="defaultListenerMethod" value="logMessage" />
</bean>
<bean id="receiver" class="module.spring.jms.xml.MessageReceiver" />
public class MessageReceiver {
public void logMessage(String message) {...}
}
ÜBUNG JMS mit Spring
- erstellen Sie einen MessageSender
- ein MessageReceiver als MessageListener
- ein MessageReceiver als ReceiverAdapter
<bean id="sender" class="module.spring.jms.xml.MessageSender">
<property name="jmsTemplate" ref="jmsTemplate" />
<property name="destination" ref="queue" />
</bean>
- Testen Sie mit ActiveMQ von Apache ► http://activemq.apache.org/
@Test // <property name="messageListener" ref="receiverAdapter" />
public void testReceiverAdapter() throws Exception {
sender.send(message);
assertEquals(message, receiver.getMessage());
}
@Test // <property name="messageListener" ref="messageListener" />
public void testMessageListener() throws Exception {
sender.sendEasy("a message");
synchronized (MyMessageListener.class) { MyMessageListener.class.wait(100);}
assertTrue(myMessageListener.isCalled());
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 124 >> total: 160 Seiten
Spring 3 >> Java Framework >> Messaging
13.5
MessageListenerContainer
- für grössere Anzahl von Messages
- halten Messages für längere Zeit
- erlauben parallele Verarbeitung
- durch Infrastruktur zur Verfügung gestellt
- Skalierbarkeit
- Ausfallsicherheit
<jms:listener-container container-type="simple" concurrency="5">
<jms:listener destination="myqueue" ref="messageHandler" method="handleMessage" />
</jms:listener-container>
<bean id="messageHandler" class="module.spring.jms.xml.MessageHandler" />
public class MessageHandler {
public void handleMessage(String message) {
synchronized (MessageHandler.class) {
MessageHandler.class.notifyAll();
}
}}
13.6
ListenerContainer
- Implementierungen variieren durch Skalierbarkeit
- Attribute concurrency definiert Parallelität
JMS Namespace
Element
Beschreibung
<jms:jca-listener-container>
konfiguriert einen Container als JCA-JMS Destination Listener
► verteillte Host Systeme
<jms:listener-container>
konfiguriert einen Container als JMS Destination Listener
<jms:listener>
deklariert einen Listener für JMS-POJO
- TX Namespace erfordert XSD Schema
<beans xmlns:tx="http://www.springframework.org/schema/jms"
xsi:schemaLocation="
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-3.0.xsd">
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 125 >> total: 160 Seiten
Spring 3 >> Java Framework >> Messaging
ÜBUNG JMS mit Spring ListenerContainer
ListenerContainer
- definieren Sie einen MessageHandler für einen ListenerContainer
<bean id="messageHandler" class="module.spring.jms.xml.MessageHandler" />
public class MessageHandler {
private static boolean called = false;
public static boolean isCalled() {
return called;
}
public void handleMessage(String message) {
called = true;
synchronized (MessageHandler.class) { MessageHandler.class.notifyAll(); }
}}
@Test public void testListenerContainer() throws InterruptedException {
assertFalse(MessageHandler.isCalled());
jmsTemplate.convertAndSend("one more message");
synchronized (MessageHandler.class) { MessageHandler.class.wait(100);}
assertTrue(MessageHandler.isCalled());
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 126 >> total: 160 Seiten
Spring 3 >> Java Framework >> Messaging
L
Remoting
Lerninhalte
Architektur
HTTP-Invoker
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 127 >> total: 160 Seiten
Spring 3 >> Java Framework >> Remoting
14
Remoting
Spring offeriert Support für verschiedene Protokolle
- RMI Remote Method Invocation
- verteilte Aufrufe
- implementiert das Exporter Pattern
- HTTP Hyper Text Transfer Protocol
- HttpInvoker (Austausch serialisierter Objekte über HTTP)
- SOAP ursprünglich für Simple Object Access Protocol
- SOAP Spring WebService
- EJB Enterprise JavaBeans
- JSR 220 konform
Remoting basiert auf dem Exporter Pattern
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="RemoteServerName" />
<property name="service" ref="server" />
<property name="serviceInterface" value="...RemoteService" />
</bean>
14.1
Architektur
- gleicher Ansatz für alle Remote Modelle
- Service als Spring Bean konfiguriert
Remote Service
- Applicationkontext erzeugt Service
- als Singleton
- steht im Netzwerk zur Verfügung
Client Zugriff
- durch ein Proxyobjekt unterstützt
- stellt clientseitiges Gegenstück
zum Serviceexporter dar
- bietet Hilfestellung beim Decodieren
der empfangenen Daten
- Client wird gegen Interface programmiert
- implementiert das ursprüngliche Serviceobjekt
- Übertragung ist transparent
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 128 >> total: 160 Seiten
Spring 3 >> Java Framework >> Remoting
Remoting
Architektur
RMI
Beschreibung
RMI (Remote Method Invocation) erlaubt den Austausch von Objekten in Verteilten
Applikationen.
Spring reduziert Codeaufwand
Spring bietet Integration von JNDI ► CORBA Services
JAXRPC (Java API for XML-based Remote Procedure Calls)
bietet Schnittstelle für Zugriff und die Bereitstellung von RPC-Style SOAP Webservices
JAXRPC
Spring bietet einfache Erstellungsmöglichkeiten von JAXRPC Client Anwendungen
Spring bietet servletbasierte Services durch JAXRPC-Implementierung ►z.B. Apache
Axis
HTTP Invoker
Hessian
Burlap
HTTP Invoker unterstützt Austausch von serialisierten Objekten über HTTP
Spring bietet Serialisierungstechniken
Hessian und Burlap sind Serialisierungsprotokolle von Caucho
Hessian serialisiert binär
Burlap basiert auf XML
► www.caucho.com
ÜBUNG RMI mit Spring
- erstellen Sie einen Remote Service
public interface RemoteService {
public String getMessage();
public void setMessage(String message);
}
- testen Sie einen entsprechenden RMI Client
@Before public void setUp() throws InterruptedException {
server = (RemoteService) ac.getBean("server");
}
@Test public void testRmiClient() throws Exception {
RemoteService client = (RemoteService) ac.getBean("client");
msg = "test Message";
client.setMessage(msg);
server.setMessage(server.getMessage().toUpperCase());
assertEquals(msg.toUpperCase(),client.getMessage());
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 129 >> total: 160 Seiten
Spring 3 >> Java Framework >> Remoting
14.2
wiki
wiki
Spring über HTTP
Das Hypertext Transfer Protocol (HTTP
(HTTP,
HTTP, dt. HypertextHypertext-Übertragungsprotokoll
Übertragungsprotokoll)
ertragungsprotokoll) ist ein
Protokoll zur Übertragung von Daten über ein Netzwerk.
Netzwerk. Es wird eingesetzt, um
Webseiten aus dem World Wide Web (WWW) in einen Webbrowser zu laden.
- erlaubt Administration
- WebServer, BuildTools, etc. ►Maven
- erlaubt Tuning
- Sicherheit / Ausfallsicherheit / Clustering / Skalierbarkeit / Lastverteilung
- Spring bietet modularisierte ContextLoaderListener
- initialisiert Spring Beans im Webkontext ► WEB-INF/web.xml
- Spring Beans haben Zugriff auf Servlets ► MVC
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
HttpInvokerProxy
ttpInvokerProxy
- Enterprise Application basieren mehrheitlich auf HTTP
- Senden und Empfangen von serialierten (Java-) Objekten
- Service als TO (Transferobject)
- ServiceImpl auf WebServer deployed
- JU Testklasse als Client
- SpringClient sendet Request via HttpInvoker
- SpringClient empfängt Request via HttpInvoker
- HttpInvokerProxyFactoryBean ist Proxy
- serialisiert Objekte
- übergibt serialisierte Objekte an Server
<bean id="httpService"
class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="http://localhost:8080/remoting/http.service" />
<property name="serviceInterface" value="module.spring.httpinvoker.HttpService" />
</bean>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 130 >> total: 160 Seiten
Spring 3 >> Java Framework >> Remoting
HttpInvokerServiceExporter
HttpInvokerServiceExporter
- empfängt und deserialisiert TO
<bean id="proxyService" class="...remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="serviceImpl" />
<property name="serviceInterface" value="module.spring.httpinvoker.HttpService" />
</bean>
<bean id="serviceImpl" class="module.spring.httpinvoker.HttpServiceImpl"></bean>
<bean id="urlMapping" class="...web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props><prop key="/http.service">proxyService</prop></props>
</property>
</bean>
<servlet>
<servlet-name>invoke</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>invoke</servlet-name><url-pattern>*.service</url-pattern>
</servlet-mapping>
ÜBUNG HttpInvoker
HttpInvoker
- erstellen Sie einen Service den Sie das HttpInvokerProxy ansprechen
@Test
public void testInvoker() throws Exception {
Service service = new Service("myService");
httpService.setService(service);
assertEquals(service.getName(), httpService.getService().getName());
}
<bean id="httpService" class="...remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="http://localhost:8080/invoke/http.service" />
<property name="serviceInterface" value="module.spring.httpinvoker.HttpService" />
</bean>
- Project dem Webserver zur Verfügung stellen
<Context
docBase="...\spring_httpInvoker\src\main\webapp"
path="/invoke"
reloadable="true"/>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 131 >> total: 160 Seiten
Spring 3 >> Java Framework >> Remoting
M
Spring MVC
Lerninhalte
Spring MVC
DispatcherServlet
Controller
Validierung
View Technologien
Handler Mapping
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 132 >> total: 160 Seiten
Spring 3 >> Java Framework >> MVC
15
MVC
Verteilte Anwendungen haben meist Webinterface ► MVC, MVC2
wiki
Model View Controller (MVC
(MVC,
MVC, Modell/Präsentation/Steuerung) ist ein
Architekturmuster zur Strukturierung von SoftwareSoftware-Entwicklung in die drei Einheiten
Datenmodell,
Datenmodell, Präsentation und Programmsteuerung.
Programmsteuerung. Ziel des Musters ist ein flexibler
Programmentwurf,
Programmentwurf, der eine spätere Änderung oder Erweiterung erleichtert und eine
Wiederverwendbarkeit der einzelnen Komponenten ermöglicht.
- Modell
- enthält Daten, geschäftsfallrelevante Informationen
- wird mit Objekten abgebildet
- View
- entscheidet, wie das Modell dargestellt wird
- entscheidet über die Darstellungssprache, meistens HTML
- Controller
- ist für die Verarbeitung der Anfrage zuständig
- ist für das Zusammenstellen des Modells zuständig
- ist für die Weitergabe an den Client zuständig
Modelodel-Viewiew-Control
- modularisierte Logik
- Requestsparsing ► HandlerMapper
- Businessprozess ►SpringController
- Respondsrendering ► ViewResolver
- erleichtert Weiterentwicklung
- isolierte Module
Web Tier
Request
Erstellung
Controller
Client
Response
Weiterleiten
View
Modell
Service
Fassade
Verwendung
DBMS
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 133 >> total: 160 Seiten
Spring 3 >> Java Framework >> MVC
15.1
Spring MVC
Dispatcher Servlet
- Springs zentraler MVC-Bestandteil
- unterstützt mehrere Protokolle
- HTTP, Hessian, Burlap, etc.
- nimmt Request entgegen
- POST, GET, etc.
- leitet Request weiter ► dispatch
- Controller
- HandlerMapping
- ViewResolver
- Interceptoren
Arbeitsweise
- DispatcherServlet erhält einen HTTP-Request
- leitet diesen an einen Controller weiter
- welcher Controller den Request bekommt, bestimmt das HandlerMapping
- das HandlerMapping bildet URLs auf Controller ab
- im Controller läuft die Logik ab
- Datenstruktur und View wird in einem Objekt ModelAndView an das DispatcherServlet zurückgegeben
- die View rendert den HTTP-Response (Umsetzung)
- der ViewResoler mapped den logischen Namen auf eine View Komponente
- das DispatcherServlet gibt den Response an den Client zurück
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 134 >> total: 160 Seiten
Spring 3 >> Java Framework >> MVC
ÜBUNG MVC
Erstellen Sie eine MVC Template Anwendung
- ► File ►New ► Spring Template Project ► Spring MVC Project
- deployen Sie das MVC Project auf dem SpringSource tc Server
- erzeugen Sie einen eigenen Controller
@Controller
@RequestMapping
public class MyController
@RequestMapping(value =
public void a() {
}
@RequestMapping(value =
public String b() {
return "myView";
}
@RequestMapping(value =
index.jsp
public void index() {
}
}
{
"/a")
// url = /a -> rendert die View a.jsp
"/b")
// url = /b rendert die View myView.jsp
"/index") // url = /index rendert die View
Rendering Requests
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 135 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
16
Inside Spring MVC
Request Object State Diagram
16.1
Dispatcher Servlet
DispatcherServlet dient als Front-Controller
- ist ein Servlet
- definiert durch web.xml der Webanwendung
- handelt URI (Uniform Resource Identifier)
- spezialisert durch servlet-mapping
- z.B. nur die HTML Seiten
- bildet URI auf ein Spring-Bean ab
- z.B. auf einen Controller
- durch Handlermapper
<servlet>
<servlet-name>invoke</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>invoke</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 136 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
16.2
Controller
- implementiert das Controller Interface
- hat nur eine Methode ► handleRequest
- In: HTTPRequest, HTTPResponds
- Out: ModelAndView
- Bearbeitung der HTTP-Requests
- gibt View und Models zurück
- definiert Minimum eines Controllers
public interface Controller {
// Process the request and return a ModelAndView object which
// the DispatcherServlet will render.
ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception;
}
Controller
Klasse
Beschreibung
AbstractController
um eigene Controller zu implementieren
enthält Basisfunktionalität für die Abarbeitung ►z.B. Caching
MultiActionController
erlaubt mehrere Aktionen innerhalb eines Controllers zu sammeln
HTTP-Requests werden auf Methoden des Controllers gemappt
sinnvoll bei modularen Logik mit ähnlicher Funktionalität
AbstractFormController
um eigene Command-Controller zu implementieren
für Erstellung von JavaBeans durch Request Parameter
nützlich für die Validierung von Eingabedaten
unterstützt WebForms ► für Abarbeitung von Client Formularen
SimpleFormController
bietet zusätzliche Funktionalität zu Commands und Views
AbstractCommandController
AbstractWizardFormController
ThrowawayController
erlaubt es, Eingaben auf mehrere Formulare aufzuteilen
nützlich für mehrere Eingabeschritte ► z.B. Wizards
zur Abarbeitung der Request als Commands ► z.B. WebWorkActions
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 137 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
16.2.1
AbstractController
- flexible Entwicklung eines Controllers
- Aktivieren / Deaktivieren von POST / GET Requests
- Unterstützung von Caching
public class ShowBooksController extends AbstractController {
private BookService bookService;
public void setBookService(BookService bookService) {
this.bookService = bookService;
}
protected ModelAndView handleRequestInternal(
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception {
return new ModelAndView("showBooks", "bookList", bookService.getAllBooks());
}
}
- handleRequestInternal ist zentrale Methode
- implementiert die Abarbeitung des Requests
- enthält Logik oder Delegation
- Returnwert ist Instanz der Klasse ModelAndView
- View ("showBooks") / Modell ("bookList") / Modellobjekt (bookService.getAllBooks())
16.2.2
MultiActionController
- mehrere Controller in einer Implementaion
- abgeleitete Klasse übernimmt HttpRequest / HttpResponse / HttpSession
- gibt ModelAndView zurück
- Property methodNameResolver definiert Methode, die ausgeführt wird
- z.B. internalPathMethodNameResolver extrahiert Methode aus URI
- http://<host>:<port>/module.spring.mvc/Book/showAll ► ruft showAll() der Bean /Book auf
- HttpParameter action definiert Methode, die ausgeführt wird
- z.B. durch ParameterMethodNameResolver
- action="module/spring/mvc/Book"
<form action="module/spring/mvc/Book" method="POST">
<input type="submit" value="show all Books" />
</form>
<a href="module/spring/mvc/Book?action=showBooks">show All Books"</a>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 138 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
Konfiguration
Konfiguration Controller / HandlerMapping / ViewResolver
<beans>
<!-- Controller -->
<bean name="createUserForm" class="...Controller">
...
</bean>
<!-- HandlerMapping -->
<bean id="urlMapping" class="...HandlerMapping">
...
</bean>
<!-- ViewResolver -->
<bean id="viewResolver" class="...ViewResolver">
...
</bean>
</beans>
annotierter Controller
- Controller erben Funktionalität oder implementieren ein (Controller-)Interface
- Alternative mit @Controller
- Klasse wird als SpringBean instanziiert
- @RequestMapping wird durch URI aufgerufen
- auf Klasse
- auf Methode
@Controller
public class SimpleBookListController {
@Autowired
private IBookDAO bookDAO;
@RequestMapping("/showBooks.html")
protected @ModelAttribute("bookList")
List<Book> handleRequestInternal() {
return bookDAO.getAll();
}
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 139 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
Formular
Formularbearbeitung
ularbearbeitung
- Daten in Formular eingeben und durch Controller verarbeiten
- User erhält Formular per GET Request und füllt Formular aus
- Formulardaten werden per POST Request an gleichen URI gesandt
@Controller
@RequestMapping(value = "/DeleteByName")
public class BookDeleteByNameController {
@Autowired private IBookDAO bookDAO;
@RequestMapping(method = RequestMethod.GET)
protected ModelAndView showForm() {
return new ModelAndView("nameForm", "name", "");
}
@RequestMapping(method = RequestMethod.POST)
protected String handlePost(@RequestParam("name") String name) {
bookDAO.deleteByName(name);
return "success";
}
}
weitere Unterstützung der Formularbearbeitung durch:
MVC Annotations
Annotation
Einsatz Beschreibung
@Controller
@InitBinder
@ModelAttribute
@RequestMapping
@RequestParam
@SessionAttributes
Type
Method
deklariert eine Klasse als Spring MVC Controller
benutzerdefiniertes Databinding
Parameter bindet ein Modell Attribut an den Parameter
Method
bindet Returnwert der Methode an das Modell
Method
bindet ein URL Muster und/oder eine HTTP Methode an die Methode
Type
bindet ein URL Muster und/oder eine HTTP Methode an den Controller
Parameter bindet einen Requestparameter an einen Methodenparameter
Type
bindet ein Modellattribut an eine Session
<!-- Scans base package for @Components to configure as beans -->
<context:component-scan base-package="module.spring.mvc" />
<!-- Configures support for @Controllers -->
<mvc:annotation-driven />
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 140 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
ÜBUNG FormForm-Handling Controller
- erzeugen und testen Sie einen Controller, um ein Buch hinzuzufügen
@Controller @RequestMapping("/addBook.htm")
public class AddBookFormController {
@Autowired IBookDAO bookDAO;
@RequestMapping(method = RequestMethod.GET)
public String setupForm(ModelMap model) {
return "addBook";
}
@ModelAttribute("book")
public Book setupBook() {
Book book = new Book();
return book;
}
@RequestMapping(method = RequestMethod.POST)
protected String addBook(@ModelAttribute("book") Book book) {
bookDAO.addBook(book);
return "bookAdded";
}
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 141 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
16.3
wiki
Validierung
In der Softwaretechnik bezeichnet Validierung die Kontrolle eines konkreten Wertes
darauf, ob er zu einem bestimmten Datentyp gehört oder
oder in einem vorgegebenen
Wertebereich oder einer vorgegebenen Wertemenge liegt.
- Gültigkeit
- können die Daten weiter verarbeitet werden
- z.B. Kompatibilität zu Datenbank (Zahl oder Text)
- Typ
- entsprechen die Daten der notwendigen Deklaration
- z.B. Datums-, Zeitwert (TT.MM.YY HH:MM:SS)
- Bereich
- sind die Daten im nutzbaren Bereich
- z.B. innerhalb von nutzbaren Grenzen (Tage: 1 ... 31)
- Sinn und Zweck
- entsprechen die Daten dem Verarbeitungszweck
- z.B. Sonderzeichen bei Email-Adressen ([email protected])
annotationbasierter Controller ist einfach und flexibel anzuwenden ► JSR 303
vordefinierte Annotation zur Validation von Bean Attributen
Annotation
Typen
Beschreibung
@NotNull / @Null
@Min / @Max
@Digits
@Size
@Future / @Past
@Pattern
@Valid
alle
BigDecimal, BigInteger,
byte, short, int, long,
Wrapperklassen
String, Collection, Map, Array
Date, Calendar
String
Objektreferenzen
Attribute muss / Attribute darf nicht gesetzt sein
Ober- und Untergrenze für numerische Werte
Vor- und Nachkommastellen für einen numerischen
Wert
definiert die Grösse von Collections
definert die Gültigkeit für einen Datumswert
definiert eine Regex für ein Attribut
refernzierte Elemente werden [auch] validiert
Validation der ISBN
@NotNull
@Size(min = 10, max = 10)
@IsISBN
// selbstdefinierte Validierung
@Pattern(regexp = "^ISBN\\s(?=[-0-9xX ]{13}$)(?:[0-9]+[- ]){3}[0-9]*[xX0-9]$")
private String ISBN;
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 142 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
selbstdefinierte Validierung
@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = { IsISBNValidator.class })
public @interface IsISBN {
String message() default "no ISBN";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class IsISBNValidator implements ConstraintValidator<IsISBN, String> {
public void initialize(IsISBN constraintAnnotation) { }
public boolean isValid(String isbn, ConstraintValidatorContext context) {
return (isbn.length() == 10);
}
}
- Validation-Payload
- erlaubt die Zuordnung beliebiger Metadaten zu einem Constraint
Payload zur
zur metadatenbasierten Validierung
- Constraint Annotationen müssen ein Payload-Element definieren
- Default Wert muss ein leeres Array sein
Class<? extends Payload>[] payload() default {};
Anwendungsbeispiel
public static class Info implements Payload {};
public static class Error implements Payload {};
public class Address {
@NotNull(message="keine Adresse",payload=Severity.Info.class)
public String getZipCode() {...}
@NotNull(message="ungültiger Ort", payload=Severity.Error.class)
String getCity() {...}
}
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 143 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
16.4
View Technologien
- JSP View (Java Server Pages)
- Unterstützung durch Spring Tag Library
- XSLT View (Extensible Stylesheet Language Transformation)
- übersetzt XML in andere Dokumentform, z.B. XML-HTML
- Excel View
- erstellt Excel Datasheets
public class BookListExcelView extends AbstractExcelView {
protected void buildExcelDocument(Map model, HSSFWorkbook workbook,
HttpServletRequest request, HttpServletResponse response) { ...
- PDF View (Portable Document Format)
- für Weitergabe von Information
- Druckindustrie
public class BookListPdfView extends AbstractPdfView {
protected void buildPdfDocument(Map model, Document document, PdfWriter writer,
HttpServletRequest request,HttpServletResponse response) throws Exception { ...
weitere View Technologoien
- JasperReports
- generiert Reports
- Liste von Datenbeständen
- Tiles
- View aus einzelnen Komponenten zusammensetzen
- Velocity, Freemaker, etc.
- Template für dynamische Inhalte
- Atom, RSS, etc.
- Feeds in Form von News, Blogs, etc.
- Document Views
- PDF
- Excel
- JSON Mapping
- JavaScript Object Notation
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 144 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
16.4.1
ViewResolver
Views werden anhand des Namens spezifiziert
- ModelAndView enthält logischen Namen der View-Komponente
- z.B: "showBooks"
- Views sind Klassen, die das Interface View implementieren
- erhalten Methoden, z.B. render
- um die Daten aus dem Modell dem Client zu präsentieren
- View-Resolving mapped logischer Name zur passenden View
- Dispatcher Servlet gibt View Komponente an Request
- wird kein Name angegeben
- DefaultRequestToViewNameTranslator bildet URL auf den Namen der View ab
- z.B. http://www.localhost:8080/library/FindAllBooks ►FindAllBooks
<bean id="viewnameTranslator" class="...DefaultRequestToViewNameTranslator">
<property name="stripExtension" value="false" />
<property name="stripLeadingSlash" value="fasle" />
</bean>
Spring offeriert zusätzlich unterschiedliche Implementierungen
Implementierungen
Controller
Klasse
Beschreibung
InternalResourceViewResolver
löst die logischen Viewnamen in View-Objekte auf, die
durch Template-Files gerendert werden
(wie JSP oder Velocity-Templates)
BeanNameViewResolver
sucht in der Konfiguration des Dispatcherservlets nach
Beans mit der passenden ID
ResourceBundleViewResolver
löst logische Namen durch Schlüssel in einem
ResourceBundle auf
XmlViewResolver
sucht in einem XML-File nach Beans mit der passenden
ID
AbstractViewResolver
abstrakter ViewResolver mit Unterstützung für das
Cachen von Views
UrlBasedViewResolver
übersetzt den Namen einer View in eine URL
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 145 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
Beispiel InternalResourceViewResolver
- JSP als View Element verwendet die Klasse InternalResourceViewResolver
- definiert durch die XML Konfiguration des DispatcherServlet
<bean id="viewResolver" class="...web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
- InternalResourceViewResolver sucht nach einem File im Webpfad
- zusammengesetzt aus dem logischen Namen und den Properties prefix und suffix
- z.B. /WEB-INF/jsp/showBooks.jsp
- Request wird an die Klasse JstlView weitergeleitet
- mitgeliefert wird JSTL (JavaServer Pages Standard Tag Library)
- um Jakarta Tiles in die View einer Spring-MVC-Anwendung zu integrieren
- erstelltes View-Objekt wird vom ViewResolver dem DispatcherServlet zurückgeliefert
- DispatcherServlet ruft dann die View zur Darstellung des Models auf
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 146 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
16.5
HandlerMapping
HandlerMapping steuert das Weiterleiten des Requests
- DispatcherServlet sucht nach Implementierungen des Interface HandlerMapping
HandlerMapping
Klasse
Beschreibung
BeanNameUrlHandlerMapper
implementiert direkte Abbildung von URLs auf Beans
SimpleUrlHandlerMapping
konfigurierbare Abbildung von URLs auf Beans
DefaultAnnotationHandlerMapping
unterstützt annotierte Controller, Nachteil ► URL im Source
<bean id="urlMapping" class="...web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/createBook.htm">createBookForm</prop>
<prop key="/deleteBook.htm">deleteBookForm</prop>
<prop key="/showBooks.htm">showBooksController</prop>
</props>
</property>
</bean>
HandlerInterceptor
- definiert Interceptor für einen Handler
HandlerInterceptorMethoden
Methode
Beschreibung
preHandle()
wird aufgerufen vor der Ausführung des Handlers
postHandle()
postHandle()
wird aufgerufen nach der Ausführung des Handlers
afterCompletition()
wird aufgerufen nach Fertigstellung des Requests
- Beispile für den Anwendungsbereich
HandlerInterceptor
Methode
Beschreibung
UserRoleAuthorizationInterc
UserRoleAuthorizationInterceptor
überprüft die Rolle des Benutzers
OpenSessionViewInterc
OpenSessionViewInterceptor
bindet [Hibernate]-Session an HTTP Thread
LocaleChangeInterc
LocaleChangeInterceptor
ermöglicht, Locale zu manipulieren (Land, Sprache)
TimeChangeInterc
TimeChangeInterceptor
ermöglicht, Time zu manipulieren
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 147 >> total: 160 Seiten
Spring 3 >> Java Framework >> Inside Spring MVC
N
Spring Security
Lerninhalte
Servlet Filter
Autorisierung
Programatische Security
Spring Security Namespace
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 148 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Security
17
Spring Security
Spring lässt Sicherheitsartefakte einfach integrieren
-
Authentifizierung
Web Autorisierung
Methoden Autorisierung
Security Expressions
Spring Security Framework
org.springframework.security.
JAR
Zweck
spring-security
-core
Authentication und Access-Contol, Remoting Support
-web
Filters, Web-Security Infrastructure mit Servlet API Abhängigkeit
-config
Namespace Parsing
-ldap
LDAP Authentication
-acl
Domain Object ACL (Access Control List) Implementation
Spring Security's CAS (Central Authentication Service) Client
Integration
OpenID Web Authentication Support
-cas-client
-openid
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 149 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Security
17.1
Authentifizierung
- Prozess zur Behauptung und/oder Erbringen des Nachweis zur Idenfikation
- z.B. Username / Passwort
- Spring bietet umfangreichen Support zur Realm Authentifizierung
- Databanken
- LDAP ► Lightweight Directory Access Protocol
- OpenID ► dezentrales Authentifizierungssystem für Webseiten
- CAS ► (Microsoft) Code Access Security
Beispiel: JDBC User Service
<authentication-manager>
<authentication-provider>
<jdbc-user-service data-source-ref=”dataSource” />
</authentication-provider>
</authentication-manager>
17.2
Autorisierung
- Spring erleichert durch Expression Language die Autorisierung
- die Expression beinhaltet und nimmt Bezug auf
- den Benutzer
- die Rolle
- den Status der Authentifizierung
User Based Expressions
Expression
Beschreibung
authentication
SecurityContext Objekt der Benutzer Authentifizierung
principal
Authentifizierungs Objekt des momentanen Benutzers
User Based Expressions in Web Context
Expression
Beschreibung
request
referenziert HttpServletRequest
hasIpAddress(ipAddr) referenziert IpAdresse ► nach IP/Netmask Notation
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 150 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Security
Expressions für den Authentifizierungsstatus
Authentifizierungsstatus und die Benutzerrollen
SecurityExpressionRoot
Expression
Beschreibung
permitAll
immer true
denyAll
immer false
isAnonymous()
anonymer Benutzer
isAutehticated()
nicht-anonymer Benutzer
isRememberMe()
hasRole(role)
authentifizierter Benutzer durch RemenberMe
weder "nicht-anonymer"
noch "RemenberMe" Benutzer
Benutzer mit definierter Rolle
hasAnyRole(r1, r2, ...)
Benutzer mit einer der definierten Rollen
isFullyAutehticated()
17.2.1
Web-Autorisierung
- Autorisierung definert Zugriffskontrolle auf Resourcen
- per URL
- per URL/HTTP
URL Autorisierung durch Expression ermöglichen
<http auto-config=”true” use-expressions=”true”>
<intercept-url> Tag
Tag
Beschreibung
pattern
URL Pattern ► ANT -und/oder Regex Syntax
method
HTTP Methode als zusätzlicher Filter
access
zusätzliches Filterkriterium ► Regex
filters
"none" unterbindet die Spring Security Filter Kette
requires-channel
"http" oder "https"
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 151 >> total: 160 Seiten
Required
Spring 3 >> Java Framework >> Spring Security
Beispiele ► Web Security Expressions
<http use-expressions="true">
<!-- nur Administratorn von 255.255.255.0 erlauben -->
<intercept-url pattern="/admin*"
access="hasRole('admin') and hasIpAddress('192.168.1.0/24')"/>
</http>
<!-- Bilder ausschliessen -->
<intercept-url pattern=”/images/**” filters=”none” />
<!-- allen Usern Zugang zur Homepage ermöglichen -->
<intercept-url pattern=”/home” method=”GET” access=”permitAll” />
<!-- nur anonyme Benutzer können einen neuen Account anlegen -->
<intercept-url pattern=”/users” method=”POST”
access=”isAnonymous()”/>
17.2.2
HTTP Autorisierung über URL-Patterns ► Frontend
- durch URL Interceptor
<http auto-config="true">
<intercept-url pattern="/app/**" access="ROLE_USER" />
<intercept-url pattern="/admin/**" method="POST"
requires-channel="https" access="ROLE_ADMIN" />
</http>
<authentication-provider>
<user-service>
<user name="user" password="spring" authorities="ROLE_USER" />
<user name="admin" password="geheim" authorities="ROLE_USER, ROLE_ADMIN" />
</user-service>
</authentication-provider>
<http use-expressions="true">
<intercept-url pattern="/secure/**"
access="hasRole('admin) and hasIpAddress('192.168.1.0/24')" />
</http>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 152 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Security
Interceptor Varianten
- für Service Bean
<beans:bean id="myService" class="module.security.BookServiceImpl">
<intercept-methods>
<protect method="create*" access="ROLE_ADMIN" />
</intercept-methods>
</beans:bean>
- als globaler PointCut ►AspectJ
<global-method-security>
<protect-pointcut
expression="execution(* module.spring.security.*Service.*(..))"
access="ROLE_USER,ROLE_ADMIN" />
</global-method-security>
17.3
Servlet Filter
- durch DelegatingFilterProxy
- deligiert URL an springSecurityFilterChain
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- einfache Abbildung auf Views
- z.B. /app/showBooks ► /showBooks
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 153 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Security
17.4
Autorisierung auf Methodenebene ► Service Layer
- Annotations ► Framework-spezifische / JSR 250 (EJB 3)
- AOP Alliance Interceptor ► Proxy-basierter Ansatz
- AspectJ Interceptor ► Proxy-basierter Ansatz
Autorisierung durch Annotations
- ermöglicht Autorisierung durch Annotations ► global-method-security
<global-method-security pre-post-annotations="enabled"/>
<global-method-security secured-annotations="enabled"
jsr250-annotations="disabled" />
Autorisierung über Annotations auf Methoden oder Klassen/Interfaces
public interface BookService {
@Secured( { "ROLE_USER" })
public void createBook();
}
- überprüft die Rolle vor der Ausführung
@PreAuthorize("hasPermission('PERMISSION_CREATE')")
@RequestMapping(value = "/createBook")
public void createBook() {...
- überprüft die Berechtigung durch einen PermissionEvaluator
- z.B. erlaut dem "admin" Bücher zu löschen
@PreAuthorize("hasPermission(#book, 'admin')")
@RequestMapping(value = "/deleteBook")
public void deleteBook(Book book, Permission permission) {...
- erlaubt einen Benutzer "seine" Bücher zu löschen
@PreAuthorize("#book.owner == principal.name)")
@RequestMapping(value = "/deleteBook")
public void deleteBook(Book book) {
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 154 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Security
- Filtert die Methode beim Verlassen
-
durch @PostFilter Annotation
Spring iteriert durch zurückgegebene Collection
entfernt alle Elemente, für welche die Expression <false> ist
filterObject referenziert das aktuelle Objekt in der Collection
@PreAuthorize("hasRole('ROLE_USER')")
@PostFilter("hasPermission(filterObject, 'read') or hasPermission(filterObject, 'admin')")
public List getAllBooks() {
17.5
Programmatische Security
- SecurityContextHolder
- hält einen SecurityContext ► das aktuelle Authentication Objekt
- ThreadLocal (Standard), InheritableThread-Local, Global oder benutzerdefinierte Klasse
- UserDetails
- beschreibt einen Benutzer als Prinzipal
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
UserDetails ud = (UserDetails) auth.getPrincipal();
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 155 >> total: 160 Seiten
Spring 3 >> Java Framework >> Spring Security
O
Trends
Lerninhalte
Agil
Groovy
DSL – Domain Specifi Languages
NoSQL – Not Only SQL
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 156 >> total: 160 Seiten
Spring 3 >> Java Framework >> Programmierparadigma
18
Programmierparadigma
Lat: <Paradigma
Paradigma>
Paradigma = begreiflich machen, (para = neben) und (digma = zeigen)
wiki
Ein Programmierparadigma
Programmierparadigma ist das einer Programmiersprache oder
Programmiertechnik zugrunde liegende Prinzip.
Prinzip.
(einige) bekannte (Programmier)-Paradigmen
Struktur
- Strukturiert (WIE)
- Imperativ (lineare Folge von Befehlen)
- Prozedural (in Teilaufgaben zerlegt)
- Modular (Module als logische Einheiten, Funktion und Daten)
Deklaration
- Deklarativ (WAS)
- Funktional (ergebnisorientiert)
- Logisch (logikbasiert)
- Orientiert (WOZU)
Orientation
- Objekt (Kommunikation, polymorph – mehrere Formen)
- Komponenten (abstrakt)
- Aspekt (orthogonal freie Kombinierbarkeit unabhängiger Konzepte)
- Agil (DRY Don't Repeat Yourself)
Agilität
18.1
Agiles Programmieren
Lat: <agilis
agilis>
agilis = flink, beweglich (Agile Softwareentwicklung reduziert Aufwand und Regeln)
Skript- vs. Programmiersprachen
Ziel
Einsatz
Ausführung
Typisierung
Vorteile
Skriptsprache
Kombination bestehender
Bausteine (Shell-Skript),
Bibliotheken (Perl, Python)
spezifisch:
GUI (JavaScript),
Reporting (Perl)
interpretiert oder Bytecode
Programmiersprache
schwach, flexibel, dynamisch
schnelle Entwicklung (Python),
Prototypen (Shell-Skript),
kleine Systeme (Perl)
streng, flexibel
Neuentwicklungen (C, C++)
allgemein
kompilierter Maschinencode
effiziente Anbindung, Ausnutzung
von Ressourcen (C++, Java)
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 157 >> total: 160 Seiten
Spring 3 >> Java Framework >> Programmierparadigma
Historie der Skriptsprachen
JCL 1963
(Job Control Language)
AWK 1977
1977
(Aho Weinberger Kernighan)
Sh 1978
1978
(Bourne Shell)
Perl 1987
(Practical Extraction and Report
Report Language)
Python 1990
1990
(Monthy Python)
Python)
Tcl 1988
1988
(Tool Command Language)
Language)
PHP 1995
1995
Ruby 1995
1995
JavaScript 1995
1995
(Personal Home Page)
Page)
(Eng: Rubin
Rubin)
bin)
(ECMA 262)
Groovy 2003
(JSR 241)
241)
18.2
wiki
Groovy
dynamisch typisierte ProgrammierProgrammier- und Skriptsprache für die Java VM
verbindet JavaJava-Syntax mit den Konzepten von Ruby.
Ruby.
Groovy
Groovy ermöglicht:
-
pragmatisches (selbsterklärend)
extremes (code a little, test a little)
agiles (YWGWYS)
funktionales (funktionale Abhängigkeiten)
objektorientiertes (alles sind Objekte)
abstrahiertes (wieder verwendbarer Code)
effizientes (weniger Codeumfang)
einfaches (Syntax)
Programmieren.
Paradigmen
objektorientiert,
Skriptsprache,
teilweise deklarativ
Erscheinungsjahr 2003
Entwickler
The Codehaus
Aktuelle Version 1.7 (2010)
Typisierung
stark, statisch, dynamisch
Betriebssystem
plattformunabhängig
Lizenz
Open Source,
Apache Software License 2.0
Groovy. Codehaus
http://groovy.codehaus.org/
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 158 >> total: 160 Seiten
Spring 3 >> Java Framework >> Programmierparadigma
18.3
wiki
DSL Domain Specific Language
Eine domänenspezifische Sprache (engl. domaindomain-specific language,
language, DSL) ist eine
formale Sprache,
Sprache, die speziell für ein bestimmtes Problemfeld (die Domäne)
Domäne) entworfen
und implementiert wird. Beim Entwurf einer DSL wird man bemüht sein, einen hohen
Grad an Problemspezifität zu erreichen: die Sprache soll alle Probleme der Domäne
darstellen können und nichts darstellen können, was auss
ausserhalb
sserhalb der Domäne liegt.
Dadurch ist sie durch Domänenspezialisten ohne besonderes Zusatzwissen bedienbar.
Idee
-
weniger Redundanz
deklarative Beschreibung eines Sachverhaltes
HTTP
bessere Lesbarkeit
weniger technischer Code
domänenspezifische, statische Validierung
leichte Erlernbarkeit, aufgrund des beschränkten Umfangs
DSL
Domain
DSL
http
Deamon
SQL
Domain
DBMS
18.4
wiki
NoSQL (Not only SQL)
NoSQL is a movement promoting a loosely defined class of nonnon-relational data stores
that break with a long history of relational databases. These data stores may not
require fixed table schemas,
schemas, usually avoid join operations and typically scale
horizontally.
horizontally.
im Web 2.0 sind schreibende Zugriffe wichtig (nicht nur lesende)
- für Anwendungen, bei denen endgültige Konsistenz der Daten gewährleistet sein muss
- Twitter
- Facebook
- traditionell: RDBMS
-
Constraints
Transaktionen
Locking
SQL
- RDBMS haben Probleme mit der Verarbeitung und Skalierung grosser Datenmengen
- neuer Ansatz
- NoSQL z.B. "Key/Value" Storage
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 159 >> total: 160 Seiten
Spring 3 >> Java Framework >> Programmierparadigma
P
Referenzen
Lerninhalte
Bücher
Referenzen
© 2011 >> Stephan Metzler >> V 2.1 >> Seite 160 >> total: 160 Seiten
Spring 3 >> Java Framework >> Anhang
19
Anhang
Bücher
ISBN
Titel
978-3-89864-572-0
Spring3
978-3-446-41240-8
Spring im Einsatz
987-3-89864-431-0
EJB 3 professionell
0-13-142246-4
Core J2EE Patterns, Best Practices and Design Strategies
1-932394-88-5
978-3-939084-24-2
3-935042-96-5
Java Persistence with Hibernate
Java EE 5 Architekturen
Hibernate und das Java Persistence API
Online Referenzen
URL
http://www.springsource.com
Inhalt
Spring Framework
Herunterladen