SlideShare una empresa de Scribd logo
1 de 96
Thorsten Kamann ● thorsten.kamann@itemis.de   1
Ziele der Software-Entwicklung…




                     Gute                     Performante    Coole
                    Software                   Software     Software




Thorsten Kamann ● thorsten.kamann@itemis.de                            2
Was ist „gute“ Software?

                      Software, die macht was sie soll


                      Qualitativ-hochwertige Software


                      Software, die den Kundenwünschen
                      entspricht




Thorsten Kamann ● thorsten.kamann@itemis.de              3
…und was man dafür braucht


                  Gute und flexible           Einwandfreie techn.
                    Architektur                  Infrastruktur




                       Gute                      Gutes und
                Projektorganisation            motiviertes Team

Thorsten Kamann ● thorsten.kamann@itemis.de                         4
Das Thema heute ist:


                  Gute und flexible           Einwandfreie techn.
                    Architektur                  Infrastruktur




                       Gute                      Gutes und
                Projektorganisation            motiviertes Team

Thorsten Kamann ● thorsten.kamann@itemis.de                         5
Thorsten Kamann ● thorsten.kamann@itemis.de   6
Technische Infrastruktur

                                                Versionskontrolle

                                                 Buildumgebung

                                              Entwicklungsumgebung

                                                  Testumgebung



Thorsten Kamann ● thorsten.kamann@itemis.de                          7
Technische Infrastruktur
    Versionskontrolle
     •   OpenSource
     •   Knowhow verfügbar
     •   Erprobt
     •   Sehr guter Toolsupport
     •   Standardisierter Zugriff über WebDAV
         (optional)




Thorsten Kamann ● thorsten.kamann@itemis.de     8
Technische Infrastruktur
    Buildumgebung
     • OpenSource
     • Leicht anpassbar
     • Knowhow
     • Transitive Abhängigkeiten und zentrale
       Repositories
     • Projekt Metainformationen
     • Reporting
     • Continous Integration


Thorsten Kamann ● thorsten.kamann@itemis.de     9
Technische Infrastruktur
    Entwicklungsumgebung
     • Anpassbar
     • Erweiterbar
     • Knowhow
     • Gute Integration der verwendeten
       Komponenten
       • Versionskontrolle, Build- und
         Testumgebung
     • Effektives Arbeiten


Thorsten Kamann ● thorsten.kamann@itemis.de   10
Technische Infrastruktur
    Testumgebung
     • Integrationtests
        • Produktionsähnliche Umgebung
        • Parallele Tests
        • Failure eines oder mehrerer Tests dürfen nicht zum
          Ausfall der gesamten Testumgebung führen




Thorsten Kamann ● thorsten.kamann@itemis.de                    11
Thorsten Kamann ● thorsten.kamann@itemis.de   12
Leichtgewichtige Architekturen?




Thorsten Kamann ● thorsten.kamann@itemis.de   13
Leichtgewichtige Architekturen
    Geringe Abhängigkeit zur Ablaufumgebung

     • Code kennt seinen Container nicht
     • Deployment entscheidet über die
       Ablaufumgebung
     • Während der Entwicklungszeit schneller
       Servlet-Container anstatt J2EE-Server




Thorsten Kamann ● thorsten.kamann@itemis.de     14
Leichtgewichtige Architekturen
    Modularisierung
     •   Komponenten ohne starke Abhängigkeiten
     •   Serviceschnittstellen
     •   POJO-Komponentenmodell
     •   Programmieren gegen Interfaces




Thorsten Kamann ● thorsten.kamann@itemis.de       15
Leichtgewichtige Architekturen
    Testbarkeit
     • Geringe Abhängigkeiten verbessern
       Testmöglichkeiten
     • „Schnelle“ Tests motivieren zum Test-
       Driven-Development
     • Komplexe Komponenten einfach gegen
       Dummies oder Mocks austauschbar



Thorsten Kamann ● thorsten.kamann@itemis.de    16
Thorsten Kamann ● thorsten.kamann@itemis.de   17
Beispiel: Das Domänenmodell




Thorsten Kamann ● thorsten.kamann@itemis.de   18
Beispiel: Komponenten




Thorsten Kamann ● thorsten.kamann@itemis.de   19
Beispiel: Komponenten




Thorsten Kamann ● thorsten.kamann@itemis.de   20
Beispiel: Komponenten

                   •   Grundgerüst für Projekte
                   •   Projekt-Gesundheit durch Reporting
                   •   Löst Abhängigkeiten auf
                   •   Build


                                     Maven

Thorsten Kamann ● thorsten.kamann@itemis.de                 21
Beispiel: Komponenten

                   •   IOC-Container
                   •   Dependency Injection
                   •   Programmiermodell
                   •   Abstrahierungen wichtiger Standards
                       (z.B. JPA, WS, JMX,…)


                                       Spring
Thorsten Kamann ● thorsten.kamann@itemis.de                  22
Beispiel: Komponenten

                   • Defacto Standard im Bereich OR-
                     Mapping
                   • Vorlage für den JPA-Standard
                   • Voll JPA-kompatibel



                                      Hibernate

Thorsten Kamann ● thorsten.kamann@itemis.de            23
Beispiel: Komponenten

                   • Dynamische Sprache
                   • 100% Integration in die Java-VM
                   • Mächtige Sprachfeatures
                   • Bi-direktionale Nutzung mit Java-
                     Code
                   • Ideal für Unit-Testing

                                       Groovy
Thorsten Kamann ● thorsten.kamann@itemis.de              24
Thorsten Kamann ● thorsten.kamann@itemis.de   25
Exkurs: Maven
     Features
      • Beschreibung eines Projekts mittels Metadaten
      • Beschreibung des resultierenden Artefakts und dessen
        Abhängigkeiten
      • Support von SNAPSHOT-Versionen
      • Projektabhängigkeiten
      • Anpassung des Buildprozess mit PlugIns
      • Reporting
      • Convention Over Configuration
      • Release Management

Thorsten Kamann ● thorsten.kamann@itemis.de                    26
Exkurs: Maven - Repositories
   Lokales Repository
    • Befindet sich auf dem lokalen Rechner
    • Mit „install“ werden Artefakte installiert
    • Nicht shareable

   Remote Repository
    • Befindet sich auf einem entfernten Server
    • Mit „deploy“ werden Artefakte deployed:
       per ssh, webdav, file, ftp,…
    • Shareable


Thorsten Kamann ● thorsten.kamann@itemis.de        27
Exkurs: Maven - Abhängigkeiten
  <project>
    <modelVersion>4.0.0</modelVersion>
                                                      Artefakt-Beschreibung
    <groupId>spring2.jpa.basic</groupId>
    <artifactId>spring2-jpa-basic-impl</artifactId>
                                                      SNAPSHOT!
    <version>1.0.0-SNAPSHOT</version>
    <dependencies>
       <dependency>
                                                      Abhängigkeit liefert
          <groupId>org.springframework</groupId>
                                                      alle benötigten
          <artifactId>spring</artifactId>
          <version>2.0.6</version>                    Bibliotheken
    </dependency>
    […]
    </dependencies>
    […]
  </project>


Thorsten Kamann ● thorsten.kamann@itemis.de                                  28
Exkurs: Maven - PlugIns
 <build>
                                                        PlugIn für
   <plugins>
                                                        Eclipse-Projekte
     <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.4</version>                          Lädt
        <configuration>
                                                        Source-JAR‘s
          <downloadSources>true</downloadSources>
          <downloadJavadocs>true</downloadJavadocs>
                                                        Lädt
          <additionalProjectnatures/>
                                                        JavaDocs-JAR‘s
          <additionalBuildcommands/>
         </configuration>
                                                        Natures und
      </plugin>
   </plugins>                                           Builders
 </build>


Thorsten Kamann ● thorsten.kamann@itemis.de                                29
Thorsten Kamann ● thorsten.kamann@itemis.de   30
Exkurs: Spring [Was ist Spring?]

                            Inversion
                                                     Ansammlung von
                                of
                                                          API's
                             Control


                                              Programmier-
                                                 modell



Thorsten Kamann ● thorsten.kamann@itemis.de                           31
Exkurs: Spring [Komponenten]

                                         Spring Core
                           AOP
                                                               WEB
                                                    JEE
                   Spring AOP
                                                              Spring MVC
                AspectJ-Integration                  JMX
                                                                 Struts
                                                     JMS
                                         ORM                   WebWork
             DAO                                     JCA
                                                               Tapestry
                                         JPA       Remoting
        Spring JDBC                                               JSF
                                       Hibernate    EJB's
        Transaction-                                              PDF
                                        Toplink     Email
        Management                                              Portlets
                                         JDO

Thorsten Kamann ● thorsten.kamann@itemis.de                                32
Exkurs: Spring [Spring-Module]
                                               Spring
          Spring                                              Spring
                                              WebService
         WebFlow                                             Security
                                                Spring       Spring
     Spring LDAP
                                              Rich Client   Extensions
                                                Spring
       Spring IDE                                           Spring OSGI
                                               BeanDoc
         Spring                                               Spring
                                              Spring .NET
       JavaConfig                                             Batch

Thorsten Kamann ● thorsten.kamann@itemis.de                               33
Exkurs: Spring [Features]
          Leichtgewichtiger Container
           • Zentralisierte und automatisierte
             Konfiguration und Verdrahtung
           • Nicht invasiv
           • Fügt lose gekoppelte Komponenten (POJO's)
             zu komplexen Systemen zusammen
           • Skalierbar
           • Verbessert die Testbarkeit der Komponenten

Thorsten Kamann ● thorsten.kamann@itemis.de               34
Exkurs: Spring [Features]
          Abstraktions Transaktions-Management

           • Erweiterbares Transaktions-Management
           • Deklarative Konfiguration der
             Transaktionen
           • Nicht auf J2EE-Umgebungen beschränkt




Thorsten Kamann ● thorsten.kamann@itemis.de          35
Exkurs: Spring [Features]
          Abstraktionsschicht für reines JDBC
           • 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

Thorsten Kamann ● thorsten.kamann@itemis.de             36
Exkurs: Spring [Features]
          Integration O/R-Mapper

           • 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


Thorsten Kamann ● thorsten.kamann@itemis.de              37
Exkurs: Spring [Features]
          AOP Funktionalität

           • 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


Thorsten Kamann ● thorsten.kamann@itemis.de            38
Exkurs: Spring [Features]
          MVC-Webapplication Framework

           • Benutzt die Spring-Core Funktionalitäten
           • Sehr konfigurierbar durch verschiedene
             Strategie-Interfaces
           • Kombinierbar mit den verschiedensten
             Viewtechnologien:
           • JSP, Velocity, Tiles, iText, POI


Thorsten Kamann ● thorsten.kamann@itemis.de             39
Exkurs: Spring [Features]
          Dynamische Sprachen

           • Groovy, JRuby, BeanShell
           • Eigener Namespace für jede Sprache
           • Autom. Reloading
                           refresh-check-delay=quot;TIME_IN_MSECquot;
           • Inline-Scripts
           • Grails ist eine Spring Web MVC Anwendung


Thorsten Kamann ● thorsten.kamann@itemis.de                     40
Exkurs: Spring [Features]

          Abstraktionsschicht für JMS

           • Unterstützt JMS 1.0.2 und 1.1
           • Unterstützt synchrone und asynchrone Calls
           • Bietet ein einfaches API mittels
             JMSTemplate




Thorsten Kamann ● thorsten.kamann@itemis.de               41
Exkurs: Spring [Features]
          Support für JMX
           • MbeanExporter ermöglicht den Export
             jedes SpringBeans als MBean
           • Listener-Support
           • Notification-Support
           • Verschiedene Naming-Strategies



Thorsten Kamann ● thorsten.kamann@itemis.de        42
Thorsten Kamann ● thorsten.kamann@itemis.de   43
Exkurs: Java Persistence API




Thorsten Kamann ● thorsten.kamann@itemis.de   44
Exkurs: Java Persistence API
                  Konzept
                   • JSR 220
                   • Entities sind POJO‘s
                   • Oft Entities = Tabelle in DB
                   • Instanzen einer Entity sind Zeilen einer
                     DB-Tabelle
                   • Konfiguration per
                       • Annotations
                       • XML

Thorsten Kamann ● thorsten.kamann@itemis.de                     45
Exkurs: Java Persistence API
                  Query Language
                   • Java Persistence Query Language
                   • Ähnelt SQL
                   • Arbeitet mit Entity-Instanzen anstatt
                     DB-Tabellen




Thorsten Kamann ● thorsten.kamann@itemis.de                  46
Thorsten Kamann ● thorsten.kamann@itemis.de   47
Exkurs: Groovy
   Features
    •   JSR 241
    •   Dynamische Sprache
    •   100% Integration in die Java VM
    •   Mächtige Syntax
    •   Schnell erlernbar
    •   Support für Domain Specific Languages (DSL)
    •   Vereinfacht Unit-Testing (jUnit integriert)
    •   Mächtige XML-Verarbeitung
    •   Kompiliert zu Java Bytecode

Thorsten Kamann ● thorsten.kamann@itemis.de           48
Exkurs: Groovy
   Closures
    • Codeblöcke
    • Können einen Wert/Objekt zurückgeben
    • Referenzieren und verwenden Variablen
    • call()(implizit/explizit) führt die Closure
      aus
    • Können an eine Variable gebunden werden
    • Ähneln Java Inner Classes




Thorsten Kamann ● thorsten.kamann@itemis.de         49
Exkurs: Groovy
  The Groovy Truth
  Runtime type             Evaluation criterion required for truth
                           Booleanwert muss true sein
  Boolean
  Matcher                  Der reguläre Ausdruck muss mindestens 1 Treffer haben
  Collection               Die Collection darf nicht leer sein
  Map                      Die Map darf nicht leer sein
  String                   Der String darf ebenfalls nicht leer sein
  Number                   Muss ungleich 0 sein
                           Die Objektreferenz muss ungleich null sein
  Alles andere



Thorsten Kamann ● thorsten.kamann@itemis.de                                        50
Exkurs: Groovy – Listen und Ranges
  def list = [„item1“, „item2“, „item3“]
                                              Eine Liste mit 3 Einträgen
  assert list.size()

  def emptyList = []                          Eine leere Liste
  assert !emptyList
                                              Der ersten Liste wird ein
  list << „item4“
                                              Element hinzugefügt
  assert list.size() == 4
                                              Eine Range mit den Werten
  def range = [1..4]
                                              1, 2, 3, 4 wird erstellt
  assert range.size() == 4

                                              Eine Range mit den Werten
  def range1 = [1..<4]
  assert range1.size() == 3                   1, 2, 3 wird erstellt

Thorsten Kamann ● thorsten.kamann@itemis.de                                51
Exkurs: Groovy – Listen und Closures
  def list = [„item1“, „item2“, „item3“]
                                              Each-Closure
  list.each{ print it+“ „}
  > item1 item2 item3


                                              Ein bestimmtes Element
  assert list.find{it==„item2“}
                                              finden
  list = [„a1“, „a2“, „a3“, „i1“, „i2“]
                                              Eine Anzahl an Elementen
  assert list.findAll{
       it.startsWith(„i“)}.size() == 3        aus der Liste finden




Thorsten Kamann ● thorsten.kamann@itemis.de                              52
Exkurs: Groovy - Maps
  def map = [key1: „value1“, key2: „value2“]   Eine Map mit 2 Einträgen
  assert map.size() == 2
                                               wird erstellt
  assert map.key1 == „value1“
                                               Ein 3. Eintrag wird
  map.key3 == „value3“
                                               hinzugefügt
  assert map.size() == 3

                                               Alternative Zugriffsmethode
  assert map[„key2“] == „value2“
  assert map.get(„key2“) == „value2“           auf die Elemente der Map
  def emptyMap = [:]                           Eine leere Map
  assert !emptyMap
                                               wird erstellt



Thorsten Kamann ● thorsten.kamann@itemis.de                               53
Thorsten Kamann ● thorsten.kamann@itemis.de   54
Zum Beispiel: Projektstruktur
                       API


                           Implementierung

                                              Integration

                                               WebApp

                                              Webservice

Thorsten Kamann ● thorsten.kamann@itemis.de                 55
Zum Beispiel: Build
   Build mit Maven
    • Ein mvn install in dem Projekt
      spring2-jpa-basic builded alle
      Projekte
    • Das Projekt spring2-jpa-
      basic-m2 stellt eine
      vollständige Maven
      Installation zur Verfügung
    • Zusätzlich gibt es Eclipse-
      Launcher für die anfallenden
      Tasks

Thorsten Kamann ● thorsten.kamann@itemis.de   56
Thorsten Kamann ● thorsten.kamann@itemis.de   57
Zum Beispiel: API-Rollen
    Verantwortliche Rollen
     • Architekten
     • Designer
   Beteiligte Rollen
     • Entwickler
     • Kunden
     • Qualitätssicherung?


Thorsten Kamann ● thorsten.kamann@itemis.de   58
Zum Beispiel: API – Knowhow & Tools




Thorsten Kamann ● thorsten.kamann@itemis.de   59
Beispiel: API - Domänenmodell




Thorsten Kamann ● thorsten.kamann@itemis.de   60
Beispiel: API - Datenzugriff




Thorsten Kamann ● thorsten.kamann@itemis.de   61
Beispiel: API - Services




Thorsten Kamann ● thorsten.kamann@itemis.de   62
Thorsten Kamann ● thorsten.kamann@itemis.de   63
Zum Beispiel: Implementierung-Rollen
    Verantwortliche Rollen
     • Architekten
     • Designer
     • Entwickler
   Beteiligte Rollen
     • Kunden
     • Qualitätssicherung?


Thorsten Kamann ● thorsten.kamann@itemis.de   64
Zum Beispiel: Impl – Knowhow & Tools




Thorsten Kamann ● thorsten.kamann@itemis.de   65
Zum Beispiel: Impl - Entities
 @Entity(table=„CUSTOMERS“)                    Entity auf Tabelle
 public class Customer{
                                               CUSTOMERS mappen
     @Id
     @GeneratedValue(
                                               Primary Key
        strategy = GenerationType.AUTO)
     private Long id;

     @OneToOne(targetEntity = Address.class,
                                               1-zu-1 Beziehung
         cascade = { CascadeType.ALL})
     private IAddress address;
     @Column(length = 40)                      Konfiguration einer
     private String firstName;
                                               Column in der Tabelle
     …
                                               CUSTOMERS
 }


Thorsten Kamann ● thorsten.kamann@itemis.de                            66
Zum Beispiel: Impl – persistence.xml
 <persistence …>
                                                 Eindeutiger Name der
  <persistence-unit
   name=quot;spring2-jpa-basic-persistence-unitquot;>    Persistence-Unit
   <properties>
     <property
      name=quot;hibernate.jdbc.batch_sizequot;           Eigenschaften der
      value=quot;0quot;/>
                                                 Persistence-Unit
    <property
     name=quot;hibernate.default_batch_fetch_sizequot;
     value=quot;5quot;/>
    […]
   </properties>
  </persistence-unit>
 </persistence>



Thorsten Kamann ● thorsten.kamann@itemis.de                             67
Zum Beispiel: Impl – DAO‘s
  @Repository
                                                       Sorgt für die
  public class CustomerDao
                                                       Übersetzung
    implements ICustomerDao {
                                                       von Exceptions
   @PersistenceContext(
    unitName = quot;spring2-jpa-basic-persistence-unitquot;)
   protected EntityManager entityManager;              Injection des
                                                       Entity-Managers
      public List<ICustomer> findAll() {
                                                       über Spring
        return entityManager
         .createQuery(quot;from Customer cquot;)
         .getResultList();
                                                       Plain Java
      }
       […]
  }


Thorsten Kamann ● thorsten.kamann@itemis.de                              68
Zum Beispiel: Impl – Spring-Config
  <bean
   class=„PersistenceAnnotationBeanPostProcessorquot; />
  <bean
   class=„PersistenceExceptionTranslationPostProcessorquot; />




                                              Excpetion Translation

               Support der Annotations in den DAO‘s




Thorsten Kamann ● thorsten.kamann@itemis.de                           69
Zum Beispiel: Impl – Spring-Config
  <bean id=quot;entityManagerFactoryquot;
                                                      Kein JNDI
    class=„LocalContainerEntityManagerFactoryBeanquot;>
    <property name=quot;dataSourcequot; ref=quot;dataSourcequot; />
    <property name=quot;jpaVendorAdapterquot;>
    <bean
     class=„HibernateJpaVendorAdapterquot;>
                                                      JPA-Vendor
     <property name=quot;databasePlatformquot;
       value=quot;${jpa.provider.databasePlatform}quot; />
     <property name=quot;showSqlquot;
                                                      Eigenschaften des
       value=quot;${jpa.provider.showSql}quot; />
     <property name=quot;generateDdlquot;
                                                      JPA-Vendors
       value=quot;${jpa.provider.generateDdl}quot; />
    </bean>
   </property>
  </bean>

Thorsten Kamann ● thorsten.kamann@itemis.de                               70
Zum Beispiel: Impl – Spring-Config
  <bean id=quot;dataSourcequot;                            DataSource
    class=„DriverManagerDataSourcequot;
                                                   Konfiguration
    p:driverClassName=quot;${jdbc.driver.classname}quot;
    p:url=quot;${jdbc.connection.url}quot;
    p:username=quot;${jdbc.connection.uid}quot;
    p:password=quot;${jdbc.connection.pwd}quot; />




Thorsten Kamann ● thorsten.kamann@itemis.de                        71
Zum Beispiel: Impl - Services
  @Transactional
                                                    Dieser Service nimmt an
  public class CustomerService
                                                    einer Transaction teil:
    implements ICustomerService {
    private ICustomerDao customerDao;               -PROPAGATION_REQUIRED
    private IAddressDao addressDao;                 -READWRITE
                                                    -ROLLBACKFOR:
      […]
                                                       -jede RuntimeException

                                                    Diese Methode hat nur
      @Transactional(readOnly = true)
                                                    einen lesenden Zugriff
      public List<ICustomer> findAllCustomers() {
        return customerDao.findAll();
      }
      […]
  }


Thorsten Kamann ● thorsten.kamann@itemis.de                                  72
Zum Beispiel: Impl – Spring-Config
  <bean id=quot;transactionManagerquot;                  JPA
    class=„JpaTransactionManagerquot;>
                                                 Transaction-Manager
   <property name=quot;entityManagerFactoryquot;
     ref=quot;entityManagerFactoryquot; />
  </bean>                                        Transaktionen werden
                                                 per Annotations
  <tx:annotation-driven
                                                 konfiguriert
   transaction-manager=quot;transactionManagerquot; />




Thorsten Kamann ● thorsten.kamann@itemis.de                             73
Zum Beispiel: Impl – Unit Testing




Thorsten Kamann ● thorsten.kamann@itemis.de   74
Zum Beispiel: Impl – Unit Testing
    Warum Groovy?
     • Leistungsfähigere Syntax
        • Listen
        • Maps
        • Integriertes jUnit
     • Closures
     • Keine Mocks, stattdessen Maps mit Closures
           def dao = [findById:{id->
             new CustomerImpl(id:100L,firstName:“…“,…)}] as ICustomerDao
     • SpringBuilder
     • XML-Processing
Thorsten Kamann ● thorsten.kamann@itemis.de                                75
Zum Beispiel: Impl – Unit Testing
  public final void testChangeAddress() {             Erzeugung einer neuen
   IAddress expAddress = new Address(                 Instanz mit Constructor-
     street: quot;s1quot;, city: quot;c1quot;,                        Enhancement
     country: quot;c1quot;, zipCode: quot;z1quot;);
                                                      Implementierung des
      def addressDao = [                              IAddressDao
       store:{entity -> expAddress}] as IAddressDao
                                                      Neue Instanz des
      ICustomerService customerService =
       new CustomerService(addressDao: addressDao)    ICustomerService
      def result = customerService
                      .changeAddress(expAddress);     Ausführen und
      assert expAddress == result                     Ergebnis vergleichen
  }


Thorsten Kamann ● thorsten.kamann@itemis.de                                      76
Thorsten Kamann ● thorsten.kamann@itemis.de   77
Zum Beispiel: Integration-Rollen

    Verantwortliche Rollen
     • Entwickler
     • Betrieb
   Beteiligte Rollen
     • Kunden
     • Qualitätssicherung



Thorsten Kamann ● thorsten.kamann@itemis.de   78
Zum Beispiel: Integration – Knowhow




Thorsten Kamann ● thorsten.kamann@itemis.de   79
Zum Beispiel: Integration
  Spring
    • AbstractJpaTests:
      • Dependency Injection in Tests ohne Konfiguration
      • Zugriff auf EntityManager
      • Zugriff auf Spring-Ressourcen
      • tearDown macht einen RollBack
      • SpringContext wird einmalig pro TestCase initialisiert
  DBUnit
    • Erzeugt eine initiale Datenbefüllung
    • Integrierbar in Spring


Thorsten Kamann ● thorsten.kamann@itemis.de                      80
Thorsten Kamann ● thorsten.kamann@itemis.de   81
Zum Beispiel: Webapp-Rollen
    Verantwortliche Rollen
     • Architekten
     • Designer
     • Entwickler
   Beteiligte Rollen
     • Kunden
     • Qualitätssicherung


Thorsten Kamann ● thorsten.kamann@itemis.de   82
Zum Beispiel: Webapp– Knowhow




Thorsten Kamann ● thorsten.kamann@itemis.de   83
Zum Beispiel: Webapp
   Spring & JSF
    • org.springframework.web.jsf.DelegatingVariableResolver
      • Erlaubt Injection von Spring-Komponenten in
        ManagedBeans
    • Alternativ Spring-MVC
    • Bessere Navigation mit Spring-Webflow
   Grails
    • Web-Framework basierend auf Groovy und Spring
    • Anbindung an Backend-System problemlos möglich
    • Keine JSF-Unterstützung


Thorsten Kamann ● thorsten.kamann@itemis.de                    84
Thorsten Kamann ● thorsten.kamann@itemis.de   85
Zum Beispiel: Webservice - Rollen
    Verantwortliche Rollen
     • Architekten
     • Designer
     • Entwickler
   Beteiligte Rollen
     • Kunden
     • Qualitätssicherung


Thorsten Kamann ● thorsten.kamann@itemis.de   86
Zum Beispiel: Webservice – Knowhow




Thorsten Kamann ● thorsten.kamann@itemis.de   87
Zum Beispiel: Webservice
   Spring Webservice
    •   Contract-First Ansatz
    •   XML-Schema = Contract
    •   Nur der Endpoint muss programmiert werden
    •   WSDL wird zur Laufzeit erstellt
    •   Support von JAXB, Castor, XMLBeans,…




Thorsten Kamann ● thorsten.kamann@itemis.de         88
Thorsten Kamann ● thorsten.kamann@itemis.de   89
Ausblick auf Spring 2.5
                                          Voller Java 6 und JEE 5
                                                  Support

                                        Dependency Injection mit
                                             Annotations

                                     Autodetection von annotierten
                                                Klassen

                                       Built-In Support von Load-
                                              Time-Weaving

                                       Neue XML-Namespaces für
                                          „context“ und „jms“


Thorsten Kamann ● thorsten.kamann@itemis.de                          90
Thorsten Kamann ● thorsten.kamann@itemis.de   91
Fazit
   Fazit
    •   Einfaches und flexibles System
    •   Wenige Abhängigkeiten von Systemkomponenten
    •   Leicht testbar
    •   Für alle Tasks bietet Spring eine Lösung
    •   Annotations vereinfacht die Konfiguration
    •   Sehr guter Support für Integrationstest
    •   Maven bietet eine sehr leistungsfähige Projektverwaltung
    •   Unittests mit Groovy machen Spaß und sind sehr effektiv
        erstellt


Thorsten Kamann ● thorsten.kamann@itemis.de                        92
Fazit
   Verbesserungen
    • Code-Generatoren vereinfachen die Erstellung von
      Klassen und deren Annotations

    • Integration von Groovy in alle Testbereiche (Unit,
      Integration, Webtest, Webservicetest) kann die
      Qualität dramatisch erhöhen




Thorsten Kamann ● thorsten.kamann@itemis.de                93
Thorsten Kamann ● thorsten.kamann@itemis.de   94
Ressourcen: Links




Thorsten Kamann ● thorsten.kamann@itemis.de   95
Über den Referenten




Thorsten Kamann ● thorsten.kamann@itemis.de   96

Más contenido relacionado

Destacado

Destacado (20)

LinkedIn Learning | What We're Learning About Learning
LinkedIn Learning | What We're Learning About LearningLinkedIn Learning | What We're Learning About Learning
LinkedIn Learning | What We're Learning About Learning
 
Spring boot
Spring bootSpring boot
Spring boot
 
Spring in RANDI2 Action
Spring in RANDI2 ActionSpring in RANDI2 Action
Spring in RANDI2 Action
 
Mi vida
Mi vidaMi vida
Mi vida
 
Brasil FINAL
Brasil FINALBrasil FINAL
Brasil FINAL
 
Ausgezeichnete produkte wasunsumweltzeichensagen
Ausgezeichnete produkte wasunsumweltzeichensagenAusgezeichnete produkte wasunsumweltzeichensagen
Ausgezeichnete produkte wasunsumweltzeichensagen
 
97 2003
97   200397   2003
97 2003
 
Los animales
Los animalesLos animales
Los animales
 
Universidad técnica de ambato2
Universidad técnica de ambato2Universidad técnica de ambato2
Universidad técnica de ambato2
 
Regale
RegaleRegale
Regale
 
Homo videns ser digital
Homo videns ser digitalHomo videns ser digital
Homo videns ser digital
 
Historia del cine
Historia del cineHistoria del cine
Historia del cine
 
Daftar nilai uts kimia
Daftar nilai uts kimiaDaftar nilai uts kimia
Daftar nilai uts kimia
 
Dein erstes Business - Kinder lernen spielend den Umgang mit Geld
Dein erstes Business - Kinder lernen spielend den Umgang mit GeldDein erstes Business - Kinder lernen spielend den Umgang mit Geld
Dein erstes Business - Kinder lernen spielend den Umgang mit Geld
 
Gatos
GatosGatos
Gatos
 
enfermeria-oncologica123
enfermeria-oncologica123enfermeria-oncologica123
enfermeria-oncologica123
 
Practica 7
Practica 7Practica 7
Practica 7
 
Mago de oz
Mago de ozMago de oz
Mago de oz
 
Aportaciones y limitaciones de las tic
Aportaciones y limitaciones de las ticAportaciones y limitaciones de las tic
Aportaciones y limitaciones de las tic
 
Elementos tecnologicos innovadores
Elementos tecnologicos innovadoresElementos tecnologicos innovadores
Elementos tecnologicos innovadores
 

Similar a Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy

Skalierung & Performance
Skalierung & PerformanceSkalierung & Performance
Skalierung & Performanceglembotzky
 
Team Foundation Server
Team Foundation ServerTeam Foundation Server
Team Foundation Serverguest23319
 
SAP SuccessFactors Architektur und Administration
SAP SuccessFactors Architektur und AdministrationSAP SuccessFactors Architektur und Administration
SAP SuccessFactors Architektur und AdministrationMichael Mueller
 
Forms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsForms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsTorsten Kleiber
 
2. Technologie-Tag - Frontend Architektur
2. Technologie-Tag - Frontend Architektur2. Technologie-Tag - Frontend Architektur
2. Technologie-Tag - Frontend ArchitekturNico Steiner
 
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, OehmichenOdilo Oehmichen
 
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, OehmichenPatrick Baumgartner
 
Architectures for .Net Core Applications
Architectures for .Net Core ApplicationsArchitectures for .Net Core Applications
Architectures for .Net Core ApplicationsRobin Sedlaczek
 
Chaos Kata Fitnesstraining für DevOps Teams
Chaos Kata Fitnesstraining für DevOps TeamsChaos Kata Fitnesstraining für DevOps Teams
Chaos Kata Fitnesstraining für DevOps TeamsRamon Anger
 
Configuration Management (Fokus: Version-Controlling) – Best Pracitces
Configuration Management (Fokus: Version-Controlling) – Best PracitcesConfiguration Management (Fokus: Version-Controlling) – Best Pracitces
Configuration Management (Fokus: Version-Controlling) – Best Pracitceskaftanenko
 
Lessons Learned: arc42 in einem echten DevOps Team
Lessons Learned: arc42 in einem echten DevOps TeamLessons Learned: arc42 in einem echten DevOps Team
Lessons Learned: arc42 in einem echten DevOps TeamJohannes Dienst
 
Infrastructure as Code mit Terraform
Infrastructure as Code mit TerraformInfrastructure as Code mit Terraform
Infrastructure as Code mit TerraformHarald Schmaldienst
 
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudOPEN KNOWLEDGE GmbH
 
Der Status Quo des Chaos Engineerings
Der Status Quo des Chaos EngineeringsDer Status Quo des Chaos Engineerings
Der Status Quo des Chaos EngineeringsQAware GmbH
 
camunda BPM - presented at Oracle vs. camunda Shootout Roadshow
camunda BPM - presented at Oracle vs. camunda Shootout Roadshowcamunda BPM - presented at Oracle vs. camunda Shootout Roadshow
camunda BPM - presented at Oracle vs. camunda Shootout Roadshowcamunda services GmbH
 
30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...
30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...
30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen....NET User Group Rhein-Neckar
 

Similar a Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy (20)

Scaling Rails
Scaling RailsScaling Rails
Scaling Rails
 
Skalierung & Performance
Skalierung & PerformanceSkalierung & Performance
Skalierung & Performance
 
Team Foundation Server
Team Foundation ServerTeam Foundation Server
Team Foundation Server
 
Offline Arbeiten
Offline ArbeitenOffline Arbeiten
Offline Arbeiten
 
SAP SuccessFactors Architektur und Administration
SAP SuccessFactors Architektur und AdministrationSAP SuccessFactors Architektur und Administration
SAP SuccessFactors Architektur und Administration
 
Forms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsForms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and Operations
 
2. Technologie-Tag - Frontend Architektur
2. Technologie-Tag - Frontend Architektur2. Technologie-Tag - Frontend Architektur
2. Technologie-Tag - Frontend Architektur
 
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
 
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
 
Architectures for .Net Core Applications
Architectures for .Net Core ApplicationsArchitectures for .Net Core Applications
Architectures for .Net Core Applications
 
Chaos Kata Fitnesstraining für DevOps Teams
Chaos Kata Fitnesstraining für DevOps TeamsChaos Kata Fitnesstraining für DevOps Teams
Chaos Kata Fitnesstraining für DevOps Teams
 
Configuration Management (Fokus: Version-Controlling) – Best Pracitces
Configuration Management (Fokus: Version-Controlling) – Best PracitcesConfiguration Management (Fokus: Version-Controlling) – Best Pracitces
Configuration Management (Fokus: Version-Controlling) – Best Pracitces
 
Lessons Learned: arc42 in einem echten DevOps Team
Lessons Learned: arc42 in einem echten DevOps TeamLessons Learned: arc42 in einem echten DevOps Team
Lessons Learned: arc42 in einem echten DevOps Team
 
Team Foundation Server
Team Foundation ServerTeam Foundation Server
Team Foundation Server
 
Infrastructure as Code mit Terraform
Infrastructure as Code mit TerraformInfrastructure as Code mit Terraform
Infrastructure as Code mit Terraform
 
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
 
Der Status Quo des Chaos Engineerings
Der Status Quo des Chaos EngineeringsDer Status Quo des Chaos Engineerings
Der Status Quo des Chaos Engineerings
 
camunda BPM - presented at Oracle vs. camunda Shootout Roadshow
camunda BPM - presented at Oracle vs. camunda Shootout Roadshowcamunda BPM - presented at Oracle vs. camunda Shootout Roadshow
camunda BPM - presented at Oracle vs. camunda Shootout Roadshow
 
30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...
30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...
30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...
 
Ant Maven
Ant MavenAnt Maven
Ant Maven
 

Más de Thorsten Kamann

Scrum and distributed teams
Scrum and distributed teamsScrum and distributed teams
Scrum and distributed teamsThorsten Kamann
 
Effizente Entwicklung für verteilte Projekte
Effizente Entwicklung für verteilte ProjekteEffizente Entwicklung für verteilte Projekte
Effizente Entwicklung für verteilte ProjekteThorsten Kamann
 
Spring 3 - Der dritte Frühling
Spring 3 - Der dritte FrühlingSpring 3 - Der dritte Frühling
Spring 3 - Der dritte FrühlingThorsten Kamann
 
Spring 3 - An Introduction
Spring 3 - An IntroductionSpring 3 - An Introduction
Spring 3 - An IntroductionThorsten Kamann
 
Webtests Reloaded - Webtest with Selenium, TestNG, Groovy and Maven
Webtests Reloaded - Webtest with Selenium, TestNG, Groovy and MavenWebtests Reloaded - Webtest with Selenium, TestNG, Groovy and Maven
Webtests Reloaded - Webtest with Selenium, TestNG, Groovy and MavenThorsten Kamann
 
My Daily Spring - Best Practices with the Springframework
My Daily Spring - Best Practices with the SpringframeworkMy Daily Spring - Best Practices with the Springframework
My Daily Spring - Best Practices with the SpringframeworkThorsten Kamann
 
Vortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsThorsten Kamann
 
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyLeichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyThorsten Kamann
 
Let’s groove with Groovy
Let’s groove with GroovyLet’s groove with Groovy
Let’s groove with GroovyThorsten Kamann
 
Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?Thorsten Kamann
 

Más de Thorsten Kamann (12)

Scrum on rails
Scrum on railsScrum on rails
Scrum on rails
 
Scrum and distributed teams
Scrum and distributed teamsScrum and distributed teams
Scrum and distributed teams
 
Effizente Entwicklung für verteilte Projekte
Effizente Entwicklung für verteilte ProjekteEffizente Entwicklung für verteilte Projekte
Effizente Entwicklung für verteilte Projekte
 
Spring 3 - Der dritte Frühling
Spring 3 - Der dritte FrühlingSpring 3 - Der dritte Frühling
Spring 3 - Der dritte Frühling
 
Spring 3 - An Introduction
Spring 3 - An IntroductionSpring 3 - An Introduction
Spring 3 - An Introduction
 
Webtests Reloaded - Webtest with Selenium, TestNG, Groovy and Maven
Webtests Reloaded - Webtest with Selenium, TestNG, Groovy and MavenWebtests Reloaded - Webtest with Selenium, TestNG, Groovy and Maven
Webtests Reloaded - Webtest with Selenium, TestNG, Groovy and Maven
 
My Daily Spring - Best Practices with the Springframework
My Daily Spring - Best Practices with the SpringframeworkMy Daily Spring - Best Practices with the Springframework
My Daily Spring - Best Practices with the Springframework
 
Vortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development Environments
 
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyLeichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
 
Let’s groove with Groovy
Let’s groove with GroovyLet’s groove with Groovy
Let’s groove with Groovy
 
Groovy - Rocks or Not?
Groovy - Rocks or Not?Groovy - Rocks or Not?
Groovy - Rocks or Not?
 
Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?Maven2 - Die nächste Generation des Buildmanagements?
Maven2 - Die nächste Generation des Buildmanagements?
 

Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy

  • 1. Thorsten Kamann ● thorsten.kamann@itemis.de 1
  • 2. Ziele der Software-Entwicklung… Gute Performante Coole Software Software Software Thorsten Kamann ● thorsten.kamann@itemis.de 2
  • 3. Was ist „gute“ Software? Software, die macht was sie soll Qualitativ-hochwertige Software Software, die den Kundenwünschen entspricht Thorsten Kamann ● thorsten.kamann@itemis.de 3
  • 4. …und was man dafür braucht Gute und flexible Einwandfreie techn. Architektur Infrastruktur Gute Gutes und Projektorganisation motiviertes Team Thorsten Kamann ● thorsten.kamann@itemis.de 4
  • 5. Das Thema heute ist: Gute und flexible Einwandfreie techn. Architektur Infrastruktur Gute Gutes und Projektorganisation motiviertes Team Thorsten Kamann ● thorsten.kamann@itemis.de 5
  • 6. Thorsten Kamann ● thorsten.kamann@itemis.de 6
  • 7. Technische Infrastruktur Versionskontrolle Buildumgebung Entwicklungsumgebung Testumgebung Thorsten Kamann ● thorsten.kamann@itemis.de 7
  • 8. Technische Infrastruktur Versionskontrolle • OpenSource • Knowhow verfügbar • Erprobt • Sehr guter Toolsupport • Standardisierter Zugriff über WebDAV (optional) Thorsten Kamann ● thorsten.kamann@itemis.de 8
  • 9. Technische Infrastruktur Buildumgebung • OpenSource • Leicht anpassbar • Knowhow • Transitive Abhängigkeiten und zentrale Repositories • Projekt Metainformationen • Reporting • Continous Integration Thorsten Kamann ● thorsten.kamann@itemis.de 9
  • 10. Technische Infrastruktur Entwicklungsumgebung • Anpassbar • Erweiterbar • Knowhow • Gute Integration der verwendeten Komponenten • Versionskontrolle, Build- und Testumgebung • Effektives Arbeiten Thorsten Kamann ● thorsten.kamann@itemis.de 10
  • 11. Technische Infrastruktur Testumgebung • Integrationtests • Produktionsähnliche Umgebung • Parallele Tests • Failure eines oder mehrerer Tests dürfen nicht zum Ausfall der gesamten Testumgebung führen Thorsten Kamann ● thorsten.kamann@itemis.de 11
  • 12. Thorsten Kamann ● thorsten.kamann@itemis.de 12
  • 13. Leichtgewichtige Architekturen? Thorsten Kamann ● thorsten.kamann@itemis.de 13
  • 14. Leichtgewichtige Architekturen Geringe Abhängigkeit zur Ablaufumgebung • Code kennt seinen Container nicht • Deployment entscheidet über die Ablaufumgebung • Während der Entwicklungszeit schneller Servlet-Container anstatt J2EE-Server Thorsten Kamann ● thorsten.kamann@itemis.de 14
  • 15. Leichtgewichtige Architekturen Modularisierung • Komponenten ohne starke Abhängigkeiten • Serviceschnittstellen • POJO-Komponentenmodell • Programmieren gegen Interfaces Thorsten Kamann ● thorsten.kamann@itemis.de 15
  • 16. Leichtgewichtige Architekturen Testbarkeit • Geringe Abhängigkeiten verbessern Testmöglichkeiten • „Schnelle“ Tests motivieren zum Test- Driven-Development • Komplexe Komponenten einfach gegen Dummies oder Mocks austauschbar Thorsten Kamann ● thorsten.kamann@itemis.de 16
  • 17. Thorsten Kamann ● thorsten.kamann@itemis.de 17
  • 18. Beispiel: Das Domänenmodell Thorsten Kamann ● thorsten.kamann@itemis.de 18
  • 19. Beispiel: Komponenten Thorsten Kamann ● thorsten.kamann@itemis.de 19
  • 20. Beispiel: Komponenten Thorsten Kamann ● thorsten.kamann@itemis.de 20
  • 21. Beispiel: Komponenten • Grundgerüst für Projekte • Projekt-Gesundheit durch Reporting • Löst Abhängigkeiten auf • Build Maven Thorsten Kamann ● thorsten.kamann@itemis.de 21
  • 22. Beispiel: Komponenten • IOC-Container • Dependency Injection • Programmiermodell • Abstrahierungen wichtiger Standards (z.B. JPA, WS, JMX,…) Spring Thorsten Kamann ● thorsten.kamann@itemis.de 22
  • 23. Beispiel: Komponenten • Defacto Standard im Bereich OR- Mapping • Vorlage für den JPA-Standard • Voll JPA-kompatibel Hibernate Thorsten Kamann ● thorsten.kamann@itemis.de 23
  • 24. Beispiel: Komponenten • Dynamische Sprache • 100% Integration in die Java-VM • Mächtige Sprachfeatures • Bi-direktionale Nutzung mit Java- Code • Ideal für Unit-Testing Groovy Thorsten Kamann ● thorsten.kamann@itemis.de 24
  • 25. Thorsten Kamann ● thorsten.kamann@itemis.de 25
  • 26. Exkurs: Maven Features • Beschreibung eines Projekts mittels Metadaten • Beschreibung des resultierenden Artefakts und dessen Abhängigkeiten • Support von SNAPSHOT-Versionen • Projektabhängigkeiten • Anpassung des Buildprozess mit PlugIns • Reporting • Convention Over Configuration • Release Management Thorsten Kamann ● thorsten.kamann@itemis.de 26
  • 27. Exkurs: Maven - Repositories Lokales Repository • Befindet sich auf dem lokalen Rechner • Mit „install“ werden Artefakte installiert • Nicht shareable Remote Repository • Befindet sich auf einem entfernten Server • Mit „deploy“ werden Artefakte deployed: per ssh, webdav, file, ftp,… • Shareable Thorsten Kamann ● thorsten.kamann@itemis.de 27
  • 28. Exkurs: Maven - Abhängigkeiten <project> <modelVersion>4.0.0</modelVersion> Artefakt-Beschreibung <groupId>spring2.jpa.basic</groupId> <artifactId>spring2-jpa-basic-impl</artifactId> SNAPSHOT! <version>1.0.0-SNAPSHOT</version> <dependencies> <dependency> Abhängigkeit liefert <groupId>org.springframework</groupId> alle benötigten <artifactId>spring</artifactId> <version>2.0.6</version> Bibliotheken </dependency> […] </dependencies> […] </project> Thorsten Kamann ● thorsten.kamann@itemis.de 28
  • 29. Exkurs: Maven - PlugIns <build> PlugIn für <plugins> Eclipse-Projekte <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>2.4</version> Lädt <configuration> Source-JAR‘s <downloadSources>true</downloadSources> <downloadJavadocs>true</downloadJavadocs> Lädt <additionalProjectnatures/> JavaDocs-JAR‘s <additionalBuildcommands/> </configuration> Natures und </plugin> </plugins> Builders </build> Thorsten Kamann ● thorsten.kamann@itemis.de 29
  • 30. Thorsten Kamann ● thorsten.kamann@itemis.de 30
  • 31. Exkurs: Spring [Was ist Spring?] Inversion Ansammlung von of API's Control Programmier- modell Thorsten Kamann ● thorsten.kamann@itemis.de 31
  • 32. Exkurs: Spring [Komponenten] Spring Core AOP WEB JEE Spring AOP Spring MVC AspectJ-Integration JMX Struts JMS ORM WebWork DAO JCA Tapestry JPA Remoting Spring JDBC JSF Hibernate EJB's Transaction- PDF Toplink Email Management Portlets JDO Thorsten Kamann ● thorsten.kamann@itemis.de 32
  • 33. Exkurs: Spring [Spring-Module] Spring Spring Spring WebService WebFlow Security Spring Spring Spring LDAP Rich Client Extensions Spring Spring IDE Spring OSGI BeanDoc Spring Spring Spring .NET JavaConfig Batch Thorsten Kamann ● thorsten.kamann@itemis.de 33
  • 34. Exkurs: Spring [Features] Leichtgewichtiger Container • Zentralisierte und automatisierte Konfiguration und Verdrahtung • Nicht invasiv • Fügt lose gekoppelte Komponenten (POJO's) zu komplexen Systemen zusammen • Skalierbar • Verbessert die Testbarkeit der Komponenten Thorsten Kamann ● thorsten.kamann@itemis.de 34
  • 35. Exkurs: Spring [Features] Abstraktions Transaktions-Management • Erweiterbares Transaktions-Management • Deklarative Konfiguration der Transaktionen • Nicht auf J2EE-Umgebungen beschränkt Thorsten Kamann ● thorsten.kamann@itemis.de 35
  • 36. Exkurs: Spring [Features] Abstraktionsschicht für reines JDBC • 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 Thorsten Kamann ● thorsten.kamann@itemis.de 36
  • 37. Exkurs: Spring [Features] Integration O/R-Mapper • 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 Thorsten Kamann ● thorsten.kamann@itemis.de 37
  • 38. Exkurs: Spring [Features] AOP Funktionalität • 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 Thorsten Kamann ● thorsten.kamann@itemis.de 38
  • 39. Exkurs: Spring [Features] MVC-Webapplication Framework • Benutzt die Spring-Core Funktionalitäten • Sehr konfigurierbar durch verschiedene Strategie-Interfaces • Kombinierbar mit den verschiedensten Viewtechnologien: • JSP, Velocity, Tiles, iText, POI Thorsten Kamann ● thorsten.kamann@itemis.de 39
  • 40. Exkurs: Spring [Features] Dynamische Sprachen • Groovy, JRuby, BeanShell • Eigener Namespace für jede Sprache • Autom. Reloading refresh-check-delay=quot;TIME_IN_MSECquot; • Inline-Scripts • Grails ist eine Spring Web MVC Anwendung Thorsten Kamann ● thorsten.kamann@itemis.de 40
  • 41. Exkurs: Spring [Features] Abstraktionsschicht für JMS • Unterstützt JMS 1.0.2 und 1.1 • Unterstützt synchrone und asynchrone Calls • Bietet ein einfaches API mittels JMSTemplate Thorsten Kamann ● thorsten.kamann@itemis.de 41
  • 42. Exkurs: Spring [Features] Support für JMX • MbeanExporter ermöglicht den Export jedes SpringBeans als MBean • Listener-Support • Notification-Support • Verschiedene Naming-Strategies Thorsten Kamann ● thorsten.kamann@itemis.de 42
  • 43. Thorsten Kamann ● thorsten.kamann@itemis.de 43
  • 44. Exkurs: Java Persistence API Thorsten Kamann ● thorsten.kamann@itemis.de 44
  • 45. Exkurs: Java Persistence API Konzept • JSR 220 • Entities sind POJO‘s • Oft Entities = Tabelle in DB • Instanzen einer Entity sind Zeilen einer DB-Tabelle • Konfiguration per • Annotations • XML Thorsten Kamann ● thorsten.kamann@itemis.de 45
  • 46. Exkurs: Java Persistence API Query Language • Java Persistence Query Language • Ähnelt SQL • Arbeitet mit Entity-Instanzen anstatt DB-Tabellen Thorsten Kamann ● thorsten.kamann@itemis.de 46
  • 47. Thorsten Kamann ● thorsten.kamann@itemis.de 47
  • 48. Exkurs: Groovy Features • JSR 241 • Dynamische Sprache • 100% Integration in die Java VM • Mächtige Syntax • Schnell erlernbar • Support für Domain Specific Languages (DSL) • Vereinfacht Unit-Testing (jUnit integriert) • Mächtige XML-Verarbeitung • Kompiliert zu Java Bytecode Thorsten Kamann ● thorsten.kamann@itemis.de 48
  • 49. Exkurs: Groovy Closures • Codeblöcke • Können einen Wert/Objekt zurückgeben • Referenzieren und verwenden Variablen • call()(implizit/explizit) führt die Closure aus • Können an eine Variable gebunden werden • Ähneln Java Inner Classes Thorsten Kamann ● thorsten.kamann@itemis.de 49
  • 50. Exkurs: Groovy The Groovy Truth Runtime type Evaluation criterion required for truth Booleanwert muss true sein Boolean Matcher Der reguläre Ausdruck muss mindestens 1 Treffer haben Collection Die Collection darf nicht leer sein Map Die Map darf nicht leer sein String Der String darf ebenfalls nicht leer sein Number Muss ungleich 0 sein Die Objektreferenz muss ungleich null sein Alles andere Thorsten Kamann ● thorsten.kamann@itemis.de 50
  • 51. Exkurs: Groovy – Listen und Ranges def list = [„item1“, „item2“, „item3“] Eine Liste mit 3 Einträgen assert list.size() def emptyList = [] Eine leere Liste assert !emptyList Der ersten Liste wird ein list << „item4“ Element hinzugefügt assert list.size() == 4 Eine Range mit den Werten def range = [1..4] 1, 2, 3, 4 wird erstellt assert range.size() == 4 Eine Range mit den Werten def range1 = [1..<4] assert range1.size() == 3 1, 2, 3 wird erstellt Thorsten Kamann ● thorsten.kamann@itemis.de 51
  • 52. Exkurs: Groovy – Listen und Closures def list = [„item1“, „item2“, „item3“] Each-Closure list.each{ print it+“ „} > item1 item2 item3 Ein bestimmtes Element assert list.find{it==„item2“} finden list = [„a1“, „a2“, „a3“, „i1“, „i2“] Eine Anzahl an Elementen assert list.findAll{ it.startsWith(„i“)}.size() == 3 aus der Liste finden Thorsten Kamann ● thorsten.kamann@itemis.de 52
  • 53. Exkurs: Groovy - Maps def map = [key1: „value1“, key2: „value2“] Eine Map mit 2 Einträgen assert map.size() == 2 wird erstellt assert map.key1 == „value1“ Ein 3. Eintrag wird map.key3 == „value3“ hinzugefügt assert map.size() == 3 Alternative Zugriffsmethode assert map[„key2“] == „value2“ assert map.get(„key2“) == „value2“ auf die Elemente der Map def emptyMap = [:] Eine leere Map assert !emptyMap wird erstellt Thorsten Kamann ● thorsten.kamann@itemis.de 53
  • 54. Thorsten Kamann ● thorsten.kamann@itemis.de 54
  • 55. Zum Beispiel: Projektstruktur API Implementierung Integration WebApp Webservice Thorsten Kamann ● thorsten.kamann@itemis.de 55
  • 56. Zum Beispiel: Build Build mit Maven • Ein mvn install in dem Projekt spring2-jpa-basic builded alle Projekte • Das Projekt spring2-jpa- basic-m2 stellt eine vollständige Maven Installation zur Verfügung • Zusätzlich gibt es Eclipse- Launcher für die anfallenden Tasks Thorsten Kamann ● thorsten.kamann@itemis.de 56
  • 57. Thorsten Kamann ● thorsten.kamann@itemis.de 57
  • 58. Zum Beispiel: API-Rollen Verantwortliche Rollen • Architekten • Designer Beteiligte Rollen • Entwickler • Kunden • Qualitätssicherung? Thorsten Kamann ● thorsten.kamann@itemis.de 58
  • 59. Zum Beispiel: API – Knowhow & Tools Thorsten Kamann ● thorsten.kamann@itemis.de 59
  • 60. Beispiel: API - Domänenmodell Thorsten Kamann ● thorsten.kamann@itemis.de 60
  • 61. Beispiel: API - Datenzugriff Thorsten Kamann ● thorsten.kamann@itemis.de 61
  • 62. Beispiel: API - Services Thorsten Kamann ● thorsten.kamann@itemis.de 62
  • 63. Thorsten Kamann ● thorsten.kamann@itemis.de 63
  • 64. Zum Beispiel: Implementierung-Rollen Verantwortliche Rollen • Architekten • Designer • Entwickler Beteiligte Rollen • Kunden • Qualitätssicherung? Thorsten Kamann ● thorsten.kamann@itemis.de 64
  • 65. Zum Beispiel: Impl – Knowhow & Tools Thorsten Kamann ● thorsten.kamann@itemis.de 65
  • 66. Zum Beispiel: Impl - Entities @Entity(table=„CUSTOMERS“) Entity auf Tabelle public class Customer{ CUSTOMERS mappen @Id @GeneratedValue( Primary Key strategy = GenerationType.AUTO) private Long id; @OneToOne(targetEntity = Address.class, 1-zu-1 Beziehung cascade = { CascadeType.ALL}) private IAddress address; @Column(length = 40) Konfiguration einer private String firstName; Column in der Tabelle … CUSTOMERS } Thorsten Kamann ● thorsten.kamann@itemis.de 66
  • 67. Zum Beispiel: Impl – persistence.xml <persistence …> Eindeutiger Name der <persistence-unit name=quot;spring2-jpa-basic-persistence-unitquot;> Persistence-Unit <properties> <property name=quot;hibernate.jdbc.batch_sizequot; Eigenschaften der value=quot;0quot;/> Persistence-Unit <property name=quot;hibernate.default_batch_fetch_sizequot; value=quot;5quot;/> […] </properties> </persistence-unit> </persistence> Thorsten Kamann ● thorsten.kamann@itemis.de 67
  • 68. Zum Beispiel: Impl – DAO‘s @Repository Sorgt für die public class CustomerDao Übersetzung implements ICustomerDao { von Exceptions @PersistenceContext( unitName = quot;spring2-jpa-basic-persistence-unitquot;) protected EntityManager entityManager; Injection des Entity-Managers public List<ICustomer> findAll() { über Spring return entityManager .createQuery(quot;from Customer cquot;) .getResultList(); Plain Java } […] } Thorsten Kamann ● thorsten.kamann@itemis.de 68
  • 69. Zum Beispiel: Impl – Spring-Config <bean class=„PersistenceAnnotationBeanPostProcessorquot; /> <bean class=„PersistenceExceptionTranslationPostProcessorquot; /> Excpetion Translation Support der Annotations in den DAO‘s Thorsten Kamann ● thorsten.kamann@itemis.de 69
  • 70. Zum Beispiel: Impl – Spring-Config <bean id=quot;entityManagerFactoryquot; Kein JNDI class=„LocalContainerEntityManagerFactoryBeanquot;> <property name=quot;dataSourcequot; ref=quot;dataSourcequot; /> <property name=quot;jpaVendorAdapterquot;> <bean class=„HibernateJpaVendorAdapterquot;> JPA-Vendor <property name=quot;databasePlatformquot; value=quot;${jpa.provider.databasePlatform}quot; /> <property name=quot;showSqlquot; Eigenschaften des value=quot;${jpa.provider.showSql}quot; /> <property name=quot;generateDdlquot; JPA-Vendors value=quot;${jpa.provider.generateDdl}quot; /> </bean> </property> </bean> Thorsten Kamann ● thorsten.kamann@itemis.de 70
  • 71. Zum Beispiel: Impl – Spring-Config <bean id=quot;dataSourcequot; DataSource class=„DriverManagerDataSourcequot; Konfiguration p:driverClassName=quot;${jdbc.driver.classname}quot; p:url=quot;${jdbc.connection.url}quot; p:username=quot;${jdbc.connection.uid}quot; p:password=quot;${jdbc.connection.pwd}quot; /> Thorsten Kamann ● thorsten.kamann@itemis.de 71
  • 72. Zum Beispiel: Impl - Services @Transactional Dieser Service nimmt an public class CustomerService einer Transaction teil: implements ICustomerService { private ICustomerDao customerDao; -PROPAGATION_REQUIRED private IAddressDao addressDao; -READWRITE -ROLLBACKFOR: […] -jede RuntimeException Diese Methode hat nur @Transactional(readOnly = true) einen lesenden Zugriff public List<ICustomer> findAllCustomers() { return customerDao.findAll(); } […] } Thorsten Kamann ● thorsten.kamann@itemis.de 72
  • 73. Zum Beispiel: Impl – Spring-Config <bean id=quot;transactionManagerquot; JPA class=„JpaTransactionManagerquot;> Transaction-Manager <property name=quot;entityManagerFactoryquot; ref=quot;entityManagerFactoryquot; /> </bean> Transaktionen werden per Annotations <tx:annotation-driven konfiguriert transaction-manager=quot;transactionManagerquot; /> Thorsten Kamann ● thorsten.kamann@itemis.de 73
  • 74. Zum Beispiel: Impl – Unit Testing Thorsten Kamann ● thorsten.kamann@itemis.de 74
  • 75. Zum Beispiel: Impl – Unit Testing Warum Groovy? • Leistungsfähigere Syntax • Listen • Maps • Integriertes jUnit • Closures • Keine Mocks, stattdessen Maps mit Closures def dao = [findById:{id-> new CustomerImpl(id:100L,firstName:“…“,…)}] as ICustomerDao • SpringBuilder • XML-Processing Thorsten Kamann ● thorsten.kamann@itemis.de 75
  • 76. Zum Beispiel: Impl – Unit Testing public final void testChangeAddress() { Erzeugung einer neuen IAddress expAddress = new Address( Instanz mit Constructor- street: quot;s1quot;, city: quot;c1quot;, Enhancement country: quot;c1quot;, zipCode: quot;z1quot;); Implementierung des def addressDao = [ IAddressDao store:{entity -> expAddress}] as IAddressDao Neue Instanz des ICustomerService customerService = new CustomerService(addressDao: addressDao) ICustomerService def result = customerService .changeAddress(expAddress); Ausführen und assert expAddress == result Ergebnis vergleichen } Thorsten Kamann ● thorsten.kamann@itemis.de 76
  • 77. Thorsten Kamann ● thorsten.kamann@itemis.de 77
  • 78. Zum Beispiel: Integration-Rollen Verantwortliche Rollen • Entwickler • Betrieb Beteiligte Rollen • Kunden • Qualitätssicherung Thorsten Kamann ● thorsten.kamann@itemis.de 78
  • 79. Zum Beispiel: Integration – Knowhow Thorsten Kamann ● thorsten.kamann@itemis.de 79
  • 80. Zum Beispiel: Integration Spring • AbstractJpaTests: • Dependency Injection in Tests ohne Konfiguration • Zugriff auf EntityManager • Zugriff auf Spring-Ressourcen • tearDown macht einen RollBack • SpringContext wird einmalig pro TestCase initialisiert DBUnit • Erzeugt eine initiale Datenbefüllung • Integrierbar in Spring Thorsten Kamann ● thorsten.kamann@itemis.de 80
  • 81. Thorsten Kamann ● thorsten.kamann@itemis.de 81
  • 82. Zum Beispiel: Webapp-Rollen Verantwortliche Rollen • Architekten • Designer • Entwickler Beteiligte Rollen • Kunden • Qualitätssicherung Thorsten Kamann ● thorsten.kamann@itemis.de 82
  • 83. Zum Beispiel: Webapp– Knowhow Thorsten Kamann ● thorsten.kamann@itemis.de 83
  • 84. Zum Beispiel: Webapp Spring & JSF • org.springframework.web.jsf.DelegatingVariableResolver • Erlaubt Injection von Spring-Komponenten in ManagedBeans • Alternativ Spring-MVC • Bessere Navigation mit Spring-Webflow Grails • Web-Framework basierend auf Groovy und Spring • Anbindung an Backend-System problemlos möglich • Keine JSF-Unterstützung Thorsten Kamann ● thorsten.kamann@itemis.de 84
  • 85. Thorsten Kamann ● thorsten.kamann@itemis.de 85
  • 86. Zum Beispiel: Webservice - Rollen Verantwortliche Rollen • Architekten • Designer • Entwickler Beteiligte Rollen • Kunden • Qualitätssicherung Thorsten Kamann ● thorsten.kamann@itemis.de 86
  • 87. Zum Beispiel: Webservice – Knowhow Thorsten Kamann ● thorsten.kamann@itemis.de 87
  • 88. Zum Beispiel: Webservice Spring Webservice • Contract-First Ansatz • XML-Schema = Contract • Nur der Endpoint muss programmiert werden • WSDL wird zur Laufzeit erstellt • Support von JAXB, Castor, XMLBeans,… Thorsten Kamann ● thorsten.kamann@itemis.de 88
  • 89. Thorsten Kamann ● thorsten.kamann@itemis.de 89
  • 90. Ausblick auf Spring 2.5 Voller Java 6 und JEE 5 Support Dependency Injection mit Annotations Autodetection von annotierten Klassen Built-In Support von Load- Time-Weaving Neue XML-Namespaces für „context“ und „jms“ Thorsten Kamann ● thorsten.kamann@itemis.de 90
  • 91. Thorsten Kamann ● thorsten.kamann@itemis.de 91
  • 92. Fazit Fazit • Einfaches und flexibles System • Wenige Abhängigkeiten von Systemkomponenten • Leicht testbar • Für alle Tasks bietet Spring eine Lösung • Annotations vereinfacht die Konfiguration • Sehr guter Support für Integrationstest • Maven bietet eine sehr leistungsfähige Projektverwaltung • Unittests mit Groovy machen Spaß und sind sehr effektiv erstellt Thorsten Kamann ● thorsten.kamann@itemis.de 92
  • 93. Fazit Verbesserungen • Code-Generatoren vereinfachen die Erstellung von Klassen und deren Annotations • Integration von Groovy in alle Testbereiche (Unit, Integration, Webtest, Webservicetest) kann die Qualität dramatisch erhöhen Thorsten Kamann ● thorsten.kamann@itemis.de 93
  • 94. Thorsten Kamann ● thorsten.kamann@itemis.de 94
  • 95. Ressourcen: Links Thorsten Kamann ● thorsten.kamann@itemis.de 95
  • 96. Über den Referenten Thorsten Kamann ● thorsten.kamann@itemis.de 96