Features: Integration anderer Libraries und Frameworks


... [ Seminar BS, WWW und PS ] ... [ Thema Spring Framework ] ... [ Fazit und Ausblick ] ...

Features: Integration anderer Libraries und Frameworks


Übersicht

Spring besteht aus sechs Modulen. Die Module Core, welches das Inversion of Control Feature beinhaltet, und AOP, welches die Aspketorientierte Programmierung ermöglicht, wurden in den letzten beiden Kapiteln vorgestellt. In diesem Kapitel werden die anderen vier Module kurz vorgestellt.

Data Access Objects - JDBC

Die Unterstützung der Data Access Objects in Spring bezieht sich auf die Unterstützung von JDBC. Die Entwickler wollten die Nutzung von JDBC so einfach wie möglich machcen. JDBC-bezogenen Features finden sich in dem Paket org.springframework.jdbc. Hier gibt es vier Pakete welche die Arbeit mit JDBC vereinfachen sollen.
  1. core
    Das core-Paket bietet Unterstützung bei dem Zugriff auf Datenbanken mit JDBC. Es bietet die Klasse JdbcTemplate an. Mit dieser Klasse sind Datenbankabfragen einfacher zu programmieren. Der Programmierer muss sich nicht mehr um das Herstellen der Verbindung, die Ausführung des Statements, die Exception-Behandlung oder das Schließen der Verbindung kümmern. Es ist nur noch nötig das Statement festzulegen und die Ergebnisse zu behandeln. Eine XML-Konfigurationdatei zum Ausführen von Statements und Queries könnte wie folgt aussehen:
    <!-- XML-Header -->
    <beans>
      <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc.hsqldb:hsql://localhost:"/>
        <property name="username" value="system"/>
        <property name="password" value="manager"/>
      </bean>
      <bean id="execStatement" class="ExecStatement">
        <property name="dataSource" ref="dataSource"/>
      </bean>
      <bean id="runQuery" class="RunQuery">
        <property name="dataSource" ref="dataSource"/>
      </bean>
    </beans>
    
    Dies konfiguriert eine Bean dataSource, die alle Informationen zum Verbinden mit einer Datenbank enthält. Spring stellt verschiedene DataSources zur Verfügung. Die hier genutzte DriverManagerDataSource ermöglicht es Verbindung zu Datenbanken mit dem angegebenen Treiber herzustellen. Spring bietet verschiedene vorgefertige, konfigurierbare DataSources und abstrakte Klassen, um eigene DataSources zu erstellen, an. Die Bean execStatement bekommt, um den Zugriff auf die Datenbank zu ermöglichen, eine Referenz auf diese DataSource zugewiesen. Dies gilt auch für die Bean runQuery. Die Klasse ExecStatement, welche die komplette Behandlung des Statements beinhaltet, sieht folgendermaßen aus:
    import javax.sql.DataSource;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    public class ExecStatement {
      private JdbcTemplate jt;
      private DataSource dataSource;
    
      public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
      }
    
      public void doExecute() {
        jt = new JdbcTemplate(dataSource);
        jt.execute("create table mytable (id integer, name varchar(100))");
      }
    }
    
    Bei Erzeugung der Bean durch Spring wird die Eigenschaft dataSource durch die entsprechende Setter-Methode gestezt. Zum Ausführen des Statements wird lediglich die Methode doExecute aufgerufen.
    Die Klasse runQuery zum Ausführen von Queries sieht wie folgt aus:
    import javax.sql.DataSource;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    public class RunQuery {
      private JdbcTemplate jt;
      private DataSource dataSource;
    
      public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
      }
    
      public int getCount() {
        jt = new JdbcTemplate(dataSource);
        int count = jt.queryForInt("select count(*) from mytable");
        return count;
      }
    
      public List getList() {
        jt = new JdbcTemplate(dataSource);
        List rows = jt.queryForList("select * from mytable");
        return rows;
      }
    }
    
    Die Erzeugung geschieht wie auch bei dem Ausführen des Statements. Das JdbcTemplate von Spring bietet verschiedene Methoden um auf Datenbanken zuzugreifen. Weitere Methoden sind zum Beispiel queryForLong, update oder queryForObject.
  2. datasource
    In dem Paket datasource bietet Spring folgende fertige und abstrakte Klassen sowie Tools für den Zugriff auf Datenbanken:
    DataSourceUtils bietet statische Klassen zum Aufbauen und Schließen von Verbindungen.
    SmartDataSource Interface gegen das komplett eigene DataSources geschrieben werden können.
    AbstractDataSource Abstrakte Klasse, die zum einfachen Erstellen von eigenen DataSources erweitert werden kann.
    SingleConnectionDataSource Vordefinierte DataSource bei der nur eine Verbindung mit der Datenbank hergestellt wird. Aufrufe von close() werden ignoriert. Verbindung wird erst beim Zerstören der Instanz geschlossen.
    DriverManagerDataSource Erstellt Verbindung mit angegebenen Treiber. Bei jedem Zugriff wird einen neue Verbindung hergestellt.
    TransactionAwareDataSourceProxy Proxy, der eine echte DataSource ummantelt um Transaktionsmanagment in Form von Commits und Rollbacks zu realisieren.
    DataSourceTransactionManager Transaktionsmanagment-fähige Implementation.
    Zum Testen empfiehlt sich die SingleConnectionDataSource, die allerdings nicht Thread-sicher ist. Später sollte die DriverManagerDataSource genutzt und gegebenenfalls mit dem DataSourceTransactionManager ummantelt werden.
  3. support
    Das Paket support ermöglicht das Übersetzen von SQL-Exception zu DataAccessException. Spring bietet eine umfangreichere Hierarchie für Exceptions beim Datenbankenzugriff als JDBC. Mithilfe dieser Hierarchie ist es möglich differenzierter auf Exceptions einzugehen. Die Umwandlung der Fehler erfolgt bei der Nutzung des JdbcTemplate automatisch. Es ist über das Erweitern der Klasse SQLErrorCodeSQLExceptionTranslator auch möglich die Umwandlung der Fehler eigenen Bedürfnissen anzupassen.
  4. object
    Spring bietet in diesem Paket eine Möglichkeit die Ergebnisse von Datenbankabfragen in Objekte umzuwandeln. Wenn aus einer Abfrage eine Liste von Zeilen zurückkommt gibt es hier die Möglichkeit alle Ergebniszeilen zu durchlaufen und jede in ein Objekt zu schreiben. Spring bietet dafür die abstrakte Klasse MappingSqlQuery, in welcher der Konstruktor sowie die Methode mapRow implementiert werden müssen. Eine vollständige Implementierung könnte folgendermaßen aussehen:
    import org.springframework.jdbc.object.MappingSqlQuery;
    
    private class KundeMappingQuery extends MappingSqlQuery {
    
      public KundeMappingQuery(DataSource ds) {
        super(ds, "SELECT id, name FROM mytable");
        compile();
      }
    
      public Object mapRow(ResultSet rs, int rowNumber) throws SQLException {
        Kunde kunde = new Kunde();
        kunde.setId((Integer) rs.getObject("id"));
        kunde.setName(rs.getString("name"));
        return kunde;
      } 
    }
    
    Hier wird eine Abfrage und die Umwandlung einer Ergebniszeile in ein Objekt beschrieben.
    Der Zugriff auf die erzeugten Objekte geschieht dann wie folgt:
    public List getKunden() {
      KundeMappingQuery kundeQuery = new KundeMappingQuery(dataSource); 
      List kunden = kundeQuery.execute();
      return kunden;
    }
    

Obejct/Relational Mapping

Spring unterstüzt die ORM-Tools Hibernate, JDO, Oracle TopLink, iBatis SQL Maps und JPA. Die unterstützten Produkte können über ihre eigenen APIs oder mit Hilfe von Spring integriert werden. In beiden Fällen können die Tools durch die Spring-Konfiguration konfiguriert und verwaltet werden. Die Integration mit Spring bietet Vorteile in Bezug auf die Übersetzung der Exception in die oben erwähnten DataAccessExceptions und die Möglichkeit ein Transaktionsmanagment um das O/R mapping zu erzeugen.

Java Enterprise Edition


Web - Spring Web MVC

Spring bietet ein eigenen Web Framework dass nach dem MVC-Prinzip arbeitet. Außer diesem eigenen Framework werden auch andere Frameworks wie Struts, sowie View-Technologien wie JSF oder JSP untestützt.
Um den IoC-Container in einem Webcontext zu erzeugen wird das DispatcherServlet von Spring sowie der Namen des Containers in der Datei web.xml angegeben. Das DispatcherServlet sucht dann automatisch nach einer XML-Datei mit dem Namen des Containers erweitert um -servlet.xml und erzeugt den Container entsprechend dieser Datei.
<web-app>
  <servlet>
    <servlet-name>name_des_containers</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>name_des_containers</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>
In der Konfiguration des Containers gibt es eine von HandlerMapping erbende Bean. Diese Bean übernimmt die Zuweisung eines Requests zu einer Bean die das Controller-Interface implementieren. Spring bietet vorgefertigte HandlerMappings. So leitet zum Beispiel das SimpleUrlHandlerMapping Anfragen an die Bean mit dem gleichen Namen wie die Anfrage. Eine Anfrage an kundeCreate.html wird so an die Bean kundeCreateController weitergeleitet. Im Controller-Interface ist die Methode handleRequest definiert, deren Parameter der Request ist und die ein ModelAndView-Objekt zurückgibt. Anhand dieses Objektes wird über eine, das Inteface ViewResolver implementierende Bean, der benötigte View ermittelt und das Model an diesen weitergegeben. Spring bietet vorgefertige ViewResolver an. So wird in dem UrlBasedViewResolver der Name des Views als Dateiname des Views angenommen, gegebenenfalls mit Pre- und Suffix versehen und diesem View das Model übergeben. Der View erzeugt dann aus dem Model die Ausgabe.
Das Spring Web MVC bietet darüber hinaus noch Unterstützung für Internationalisierung, Themes und seit Version 2.0 auch eigene Tags für die Nutzung mit JSP.

Dynamische Sprachen

Spring bietet Unterstützung für die dynamischen Sprachen JRuby, Groovy und BeanShell. Hierfür ist es nötig einen neuen Namespace einzufügen. Danach können geschriebene Programmteile als Beans in Spring verwaltet werden. Hierfür gibt es die Tags lang:jruby, lang:groovy und lang:bsh. Es ist auch möglich die in dynamischen Sprachen geschriebenen Programmteile in dem Tag lang:inline-script inline in der XML-Konfiguration zu programmieren. Dadruch wird die Konfigurationsdatei allerdings leicht unübersichtlich.
... [ Seminar BS, WWW und PS ] ... [ Thema Spring Framework ] ... [ Features: Integration anderer Libraries und Frameworks ] ... [ Fazit und Ausblick ] ...