spring 2.0
DESCRIPTION
Eine Einführung in Spring 2. Was sind die neuen Features, welche Verbesserungen gibt es?TRANSCRIPT
Thorsten Kamann ● [email protected] 11
Thorsten Kamann ● [email protected] 22
Inhalt
Einführung
Konfiguration
AOP
Transaktionen
Spring Web MVC
Sonstiges
Zusammenfassung
Thorsten Kamann ● [email protected] 33
Einführung: Was ist Spring?
Thorsten Kamann ● [email protected] 44
Einführung: Was ist Spring?
IoC(Dependency
Injection)
Ansammlung von API‘s
Programmiermodell
Thorsten Kamann ● [email protected] 55
Einführung: Spring Komponenten
Spring CoreThe IoC Container
AOPSpring AOP
AspectJ Integration
DAOSpring JDBCTransaction
Management
ORMHibernate
JPATopLink
JDO
JEEJMXJMSJCA
RemotingEJB‘sEmail
WebSpring Web MVC
StrutsWebWorkTapestry
JSFPDF
Jasper ReportsExcel
Spring Portlet MVC
Thorsten Kamann ● [email protected] 66
Einführung: Features
• Zentralisierte und automatisierte Konfiguration und Verdrahtung der Anwendungsobjekte
• Nicht invasiv• Fügt lose gekoppelte Komponenten (POJO's) zu
komplexen Systemen zusammen• Skalierbar• Verbessert die Testbarkeit der Komponenten,
indem sie zuerst unabhängig von der Serverinfrastruktur getestet werden können
Leichtgewichtiger Container
Thorsten Kamann ● [email protected] 77
Einführung: Features
• Erweiterbares Transaktions-Management• Deklarative Konfiguration der Transaktionen,
ohne tief in das entsprechende Framework einzusteigen
• Im Gegensatz zu reinem JTA oder EJB CMP ist dieses Transaktions-Management nicht auf J2EE-Umgebungen beschränkt
Abstraktionsschicht für Transaktions-Management
Thorsten Kamann ● [email protected] 88
Einführung: Features
• Reduziert den Code für auf JDBC-basierte Anwendungen
• Vereinfacht die Fehlerbehandlung• Bietet eine aussagekräftige Exception-
Hierarchie (herstellerunabhängig)• Exceptions basieren auf der DAO-Exception-
Hierarchie
Abstraktionsschicht für reines JDBC
Thorsten Kamann ● [email protected] 99
Einführung: Features
• Unterstützung von Hibernate, Toplink, JDO und iBATIS SQL Maps
• Vereinfacht die Entwicklung mit diesen O/R-Mappern
• Unterstützung von Transaktionen• Unterstützung des DAO-Patterns
Integration von populären O/R-Mappern
Thorsten Kamann ● [email protected] 1010
Einführung: Features
• Basiert auf AspectJ• Vollständig integriert in das Spring
Konfigurations-Management• Transaktions-Management basiert auf AOP• Jedes Objekt in Spring kann mittels AOP
gemanaged werden
AOP Funktionalität
Thorsten Kamann ● [email protected] 1111
Einführung: Features
• Benutzt die Spring-Core Funktionalitäten• Sehr konfigurierbar durch verschiedene
Strategie-Interfaces• Kombinierbar mit den verschiedensten
Viewtechnologien:• JSP, Velocity, Tiles, iText, POI
Flexibles MVC-WebapplicationFramework
Thorsten Kamann ● [email protected] 1212
Konfiguration
Thorsten Kamann ● [email protected] 1313
Konfiguration: XML-Schema
• Spring Konfigurationen basieren auf XML-Schema
• Durch XML-Schema ist eine direktere Konfiguration möglich
• Dadurch kürzere und eindeutigere Konfigurationen
Konfiguration per XML-Schema
Thorsten Kamann ● [email protected] 1414
Konfiguration: XML-Schema
•<bean id=“bean1" class=“a.b.Bean">
<property name=“prop1“ value=“value1"/>
</bean>
Alt:
•<bean id=„bean1“ class=„a.b.Bean“
p.prop1=„value1“/>
Neu:
Thorsten Kamann ● [email protected] 1515
Konfiguration: Modularisierung
• Beans - Konfiguration von Spring-Beans• Utils - Utilities wie Maps, Lists, Static Fields• JEE - J2EE Konfiguration, wie EJB, JNDI• Lang - Scriptsprachen (Groovy, JRuby, BeanShell)• Tx - Transaktionen• Aop - Aspekte• Tool - 3rd Party Erweiterungen
Konfiguration besteht aus verschiedenen Schemata
Thorsten Kamann ● [email protected] 1616
Konfiguration: Erweiterungen
• 3rd Party Erweiterungen• Domänen-spezifische Konfigurationsdialekte• Tools-Schema unterstützt die Erstellung von
Erweiterungen• Einfaches Deployment mittels JAR
Erweiterbare Konfiguration
Thorsten Kamann ● [email protected] 1717
• <beans>
<bean id=„marge“ class=„Person“ p:name=„marge“>
<property name=„husband“>
<bean class=„Person“ p:name=„homer“ p:age=„45“>
<property name=„props“>
<props>
<prop key=„overweight“>true</prop>
<prop key=„height“>1.8m</prop>
</props>
</property>
</bean>
</property>
<property name=„children“><list>…</list></property>
</bean>
<bean id=„bart“ …/>
<bean id=„lisa“ …/>
</beans>
Konfiguration: XML
Thorsten Kamann ● [email protected] 1818
• @Configuration
public class MyConfig {
@Bean
public Person marge() {
Person marge = new Person();
Person husband = new Person();
marge.setName(„marge“);
marge.setHusband(husband);
marge.addCildren(bart);
return marge;
}
@Bean
public Person bart () {
Person bart = new Person();
return bart;
}
}
Konfiguration: Java
Thorsten Kamann ● [email protected] 1919
• bb.beans {
marge(Person.class) {
name = "marge„
husband = { Person p ->
name = "homer„
age = 45
props = [overweight:true,
height:"1.8m"] }
children = [bart, lisa]
}
bart(Person.class) {}
lisa(Person.class) {}
}
Konfiguration: GroovyBuilder
Thorsten Kamann ● [email protected] 2020
Konfiguration: Bean Scopes
• Singleton• Prototype• *Request (Web)• *Session (Web)• *Global Session (Portlets)
5 Bean Scopes
Thorsten Kamann ● [email protected] 2121
AOP
Thorsten Kamann ● [email protected] 2222
AOP: Allgemein
• SpringAOP ist einfacher und kann mit einfachen Beans arbeiten
• SpringAOP unterstützt zur Zeit nur Methoden-basierte Join Points
• AspectJ wird vollständig unterstützt und kann auch auf nicht-SpringBeans angewandt werden
SpringAOP vs AspectJ
Thorsten Kamann ● [email protected] 2323
AOP: Konfiguration
• Annotations (@AspectJ) oder XML-basiert• Aktivierung von @AspectJ mit <aop:aspectj-
autoproxy/>• Pointcut-Definition mit AspectJ Expression-
Sprache• AOP-Autoproxies (default) oder CGLIB-
Proxies
Konfigurationsoptionen
Thorsten Kamann ● [email protected] 2424
public class SimpleProfiler {
public Object profile(ProceedingJoinPoint call)
throws Throwable {
StopWatch clock = new StopWatch(
"Profiling for '" + call.toShortString() + "'");
try {
clock.start(call.toShortString());
return call.proceed();
} finally {
clock.stop();
System.out.println(clock.prettyPrint());
}
}
}
AOP: Beispiel (Java-Code)
Thorsten Kamann ● [email protected] 2525
<bean id="profiler“ class=„d.it.s2.test.aop.SimpleProfiler" />
<aop:config>
<aop:aspect ref="profiler">
<aop:pointcut id="daoCreate"
expression="execution(* d.i.s.dao.*.create*(..))" />
<aop:around pointcut-ref="daoCreate" method="profile" />
</aop:aspect>
<aop:aspect ref="profiler">
<aop:pointcut id="daoSave"
expression="execution(* d.i.s2.dao.*.save*(..))" />
<aop:around pointcut-ref="daoSave" method="profile" />
</aop:aspect>
</aop:config>
AOP: Beispiel (Konfig. mit Schema)
Thorsten Kamann ● [email protected] 2626
@Aspect
public class SimpleProfilerAnnotated {
@Pointcut
execution(* de.itemis.spring2.dao..create*(..))
public void create(){};
@Around(„create()“)
public Object profile(ProceedingJoinPoint call)
throws Throwable {
[…]
}
}
AOP: Beispiel (Annotations)
Thorsten Kamann ● [email protected] 2727
<bean id="profiler“
class=„d.i.s2.test.aop.SimpleProfilerAnnotated" />
<aop:aspectj-autoproxy/>
AOP: Beispiel (Konfig. mit @AspectJ)
Thorsten Kamann ● [email protected] 2828
Transaktionen
Thorsten Kamann ● [email protected] 2929
Transaktionen:Übersicht
CallerAOP-Proxy
Transaction-Advisor
Custom Advisor(s)
Target
In: Create TransactionOut: Commit/Rollback
Proxyanstatt des Ziels
Vor oder nach dem Transaction-
Advisor
Business-Logik
Thorsten Kamann ● [email protected] 3030
Transaktionen:Konfiguration
• XML-Schema (tx-Namensraum)• Annotations• Programmatisch• Intern wird AOP verwendet• Durch Verwendung von AspectJ Ausweitung
auf nicht-Spring-Objekte möglich
Konfiguration
Thorsten Kamann ● [email protected] 3131
<bean id=„txManager“/>
<tx:advice id=„txAdvice“ transaction-manager=„txManager“>
<tx:attributes>
<tx:method name=„get*“ read-only=„true“/>
<tx:method name=„*“/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id=„pid“ expression=„…“/>
<aop:advisor advice-ref=„txAdvice“ pointcut-ref=„pid“/>
</aop:config>
Transaktionen: Konfiguration (XML-Schema)
Thorsten Kamann ● [email protected] 3232
@Transactional(readOnly = true)
public class DefaultFooService implements FooService {
public Foo getFoo(String fooName) {
}
@Transactional(readOnly = false,
propagation = Propagation.REQUIRES_NEW)
public void updateFoo(Foo foo) {
}
}
Transaktionen: Konfiguration (Annotations)
Thorsten Kamann ● [email protected] 3333
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager"
class=„o.s.jdbc.datasource.DataSourceTransactionManager„
p:dataSource-ref=„dataSource“/>
Transaktionen: Konfiguration (Annotations)
Thorsten Kamann ● [email protected] 3434
Spring Web MVC
Thorsten Kamann ● [email protected] 3535
Spring Web MVC: Übersicht
• Trennung von Rollen(Controller, Validator, Command Object, Form Object, Model,…)
• Convention over Configuration• Unterstützung sämtlicher Spring Features• Eigene TagLibrary• Unterstützung einer großen Anzahl von Web-
Frameworks (JSP, JSF, Struts, Tapestry, WebWork, Velocity)
Features
Thorsten Kamann ● [email protected] 3636
Spring Web MVC
• URL Controller/welcome/* WelcomeController
• Automatische Übergabe von Modellelementen an die View: de.itemis.modell.User ist als user in der View bekannt
• URL View/welcome.jsp
/WEB-INF/jsps/welcome.jsp
Convention over Configuration
Thorsten Kamann ● [email protected] 3737
Spring Web MVC
• Seit Spring 2.0• Ermöglicht den direkten Zugriff auf Controller
und Command-Objekte• Vereinfacht die JSP‘s<form:form commandName="user">
<form:input path=„firstName“/>
</form:form>
Form TagLibrary
Thorsten Kamann ● [email protected] 3838
Sonstiges
Thorsten Kamann ● [email protected] 3939
Sonstiges: JPA
• Abstraktionsschicht für JPA• JPATemplate und JPADaoSupport arbeiten
gegen die „Plain JPA-API“• Einfache Arbeit mit verschiedenen JPA-
Implementierungen
JPA
Thorsten Kamann ● [email protected] 4040
Sonstiges: JDBC
• NamedParameterJdbcTemplateString sql =
„SELECT * FROM C WHERE c.fn = :firstName“
anstatt
String sql =„SELECT * FROM C WHERE c.fn = ?“
• SimpleJdbcTemplate• Autoboxing• varargs
JDBC
Thorsten Kamann ● [email protected] 4141
Sonstiges: Dynamische Sprachen
• Groovy, JRuby, BeanShell• Eigener Namespace für jede Sprache
• lang:groovy, lang:jruby, lang:bsh• Autom. Reloading
• refresh-check-delay="TIME_IN_MSEC"• Inline-Scripts• Grails ist eine Spring Web MVC Anwendung
Dynamische Sprachen
Thorsten Kamann ● [email protected] 4242
Sonstiges: JMX
• Notification Mechanismus• NotificationListener• NotificationPublisher
• Kontrolle des Verhaltens bei der Registrierung im MbeanServer• REGISTRATION_FAIL_ON_EXISTING • REGISTRATION_IGNORE_EXISTING• REGISTRATION_REPLACE_EXISTING
JMX
Thorsten Kamann ● [email protected] 4343
Sonstiges: Task Scheduler
• Abstraktionsschicht für das Konzept der Executors (Thread Pools in Java 5)
• Verfügbar auch für Java 1.3 und Java 1.4• Synchrone, asynchrone, zeitgesteuerte Tasks• Konfiguration über Beandefinitionen
<bean id="tE"
class="o.s.ThreadPoolTaskExecutor“/>
<bean ...>
<constructor-arg ref="tE" />
</bean>
Task Scheduler
Thorsten Kamann ● [email protected] 4444
Sonstiges: Java5-Support
• Annotations• AOP, Transaktionen, Konfiguration• Verlagert die Konfiguration von XML nach
Java Vor- oder Nachteil?• Beispiele:<tx:annotation-driven
transaction-manager="txManager"/>
<aop:aspectj-autoproxy/>
• Generics
Java5-Support
Thorsten Kamann ● [email protected] 4545
Sonstiges: Portlet MVC Framework
• Basiert auf den gleichen Konzepten wie das Spring Web MVC
• JSR-168 The Java Portlet Specification• Unterstützt Spring Webflow
Portlet MVC Framework
Thorsten Kamann ● [email protected] 4646
Spring im Entwicklungsprozess
Thorsten Kamann ● [email protected] 4747
Agiles und iteratives Vorgehen
• Agiles Vorgehen wird im Sinne von Flexibilität unterstützt
• Hohe Modularisierung möglich• Flexible Anpassung von Konfigurationen
Agil
• Die Konfiguration wächst mit der Software• Zusätzliche Features brauchen erst konfiguriert
werden, wenn die Implementierung existiert
Iterativ
Thorsten Kamann ● [email protected] 4848
Modellgetriebene Entwicklung
• Konfigurationen sind einfach zu generieren• Annotations verringern die Menge an
generierten Codezeilen• Modularisierung ermöglicht manuelle
Anpassung des Generats• Erzeugung von Testhelpern und –stubs
beschleunigen die Erstellung von Tests
MDSD
Thorsten Kamann ● [email protected] 4949
Unit-Test
• Dependency Injection fördert die Testbarkeitvon Systemen
• Austauschbare Konfiguration ermöglicht angepasste Konfiguration für Tests
• Integrationstests werden unterstützt• Tests selber können mit Spring konfiguriert
werden
Software-Tests
Thorsten Kamann ● [email protected] 5050
Zusammenfassung
Thorsten Kamann ● [email protected] 5151
Zusammenfassung
• Spring2 bietet viele sinnvolle Verbesserungen und Erweiterungen
• Die fast 100% Abwärtskompatibilität vereinfacht die Migration bestehender Anwendungen
• Durch die vollständige Integration von AOP lässt sich sehr bequem Funktionalität zu bestehendem Code hinzufügen
• Der Scriptsupport ermöglicht es, sehr dynamische Software zu bauen
Fazit
Thorsten Kamann ● [email protected] 5252
Zusammenfassung
• Spring befindet sich auf dem Weg zu einer noch besseren Modularisierung
• Teile werden in Spring-Modules ausgelagert• Einbindung in 3rd-Party Produkte ist heute
schon problemlos möglich (z.B. Celtix – ein OS ESB)
• Spring Web MVC und Spring PortletFramework bieten eine sehr gute Basis für Webanwendungen (siehe Grails)
Ausblick
Thorsten Kamann ● [email protected] 5353
Links
Thorsten Kamann ● [email protected] 5454
• Springframework Webseitehttp://www.springframework.org
• Spring IDE (Eclipse Plugin)http://www.springide.org
• Grailshttp://www.grails.org/
• Thorsten Kamannhttp://www.thorsten-kamann.de
• Beispielprojekt mit Spring2, Hibernate und AOPhttp://thorque.wiki.com/Spring_2.0
Links