Spring und Scala im Tandem

A Match made in Heaven

Eberhard Wolff

Die Programmiersprache Scala erfreut sich immer größerer Beliebtheit unter Java-Entwicklern. Und in der Java-Welt gibt es Frameworks wie Spring. Da drängt sich die Frage auf: Was passiert, wenn Scala und Spring kombiniert werden?

Java Magazin

Der Artikel „A Match made in Heaven“ von Eberhard Wolff ist erstmalig erschienen im Java Magazin 6.2012.

Scala hat einige interessante Eigenschaften, die es gerade für Java-Entwickler attraktiv macht. Genauso wie Java ist die Sprache statisch typisiert und stellt Eleganz in den Mittelpunkt. Durch funktionale Programmierung kann Scala vor allem Vorteile in der Entwicklung von nebenläufigen Systemen bieten. Aber es gibt es nur wenige Scala-Bibliotheken für die Entwicklung von Enterprise-Anwendungen. Daher lohnt ein Blick auf das Spring-Framework: Es ist ein sehr wichtiges Werkzeug für Java-Enterprise-Systeme, vor allem aber sehr flexibel. Die Chancen für eine gewinnbringende Integration mit Scala stehen also sehr gut.

Springs Bausteine

Das Spring-Framework bestehen aus verschiedenen Teilen:

  • Durch Dependency Injection wird die Zusammenarbeit der Objekte in der Anwendung organisiert
  • Mit aspektorientierter Programmierung (AOP) können Querschnittsbelange wie Sicherheit oder Transaktionen zentralisiert implementiert werden
  • Die Service-Abstraktion bietet ein einheitliches und vereinfachtes API für Java-APIs wie JMS, JDBC oder Transaktionen an

Die grundlegende Frage ist, wie diese einzelnen Elemente von Spring mit Scala genutzt werden können.

Dependency Injection

Zunächst kurz zur Definition von Dependency Injection (DI): Bei diesem Ansatz werden den Objekten die abhängigen Objekte injiziert, also von außen zugewiesen. So können Abhängigkeiten einfacher gehandhabt werden. Außerdem ist es möglich, die abhängigen Objekte für Tests zu ersetzen, um so bestimmte Szenarien zu simulieren. Anwendungen lassen sich außerdem einfacher konfigurieren, weil recht unkompliziert andere Objekte oder Werte injiziert werden können, die in der Konfiguration abgelegt und daher einfach überschreibbar sind.

DI ist ein Pattern und kann im Code implementiert werden – auch mit Scala. Wenn die Konfiguration für DI aber in einer getrennten Datei außerhalb des Programmcodes geschieht, kann sie ohne ein erneutes Kompilieren oder Deployen der Anwendung geändert werden. Außerdem kann dann DI genutzt werden, um Konfigurationsparameter in Objekte zu injizieren. So wird ein eigener Mechanismus für die Konfiguration der Anwendung überflüssig. Spring bietet eine Vielzahl unterschiedlicher Ansätze für DI an. Dazu zählen DI-Konfigurationen in XML, im Code (JavaConfig) und mithilfe von Annotationen. Als Beispiel für eine durch Dependency Injection zu konfigurierende Klasse dient das in Scala geschriebene CustomerDao aus Listing 1. Es kapselt die Persistenz für Customer und hängt von einer DataSource ab, die den Zugriff auf die Datenbank bietet. Die DataSource wird im Konstruktor injiziert und dann zum Erzeugen eines JdbcTemplates genutzt, einer Klasse aus dem Spring-Framework für den Zugriff auf Datenbanken. Sowohl die DataSource als auch das JdbcTemplate können zur Laufzeit nicht geändert werden. Scala stellt solche unveränderlichen Objekte in den Mittelpunkt, die beispielsweise bei der Programmierung nebenläufiger Systeme erhebliche Vorteile bieten.

Kurz ein paar Worte zu Singletons: Für diese bietet Scala das Schlüsselwort object. Im Beispiel wird aber class und damit eine Scala-Klasse genutzt. Der Grund ist, dass Spring andere Objekte injizieren soll und daher die Erzeugung der Objekte übernehmen muss – was bei einem Scala-object nicht möglich ist. Diese Lösung ist auch flexibler, weil die Klasse von Spring mit anderen Scopes wie Sessionoder Request ausgestattet werden kann.

Listing 1: DAO in Scala
class CustomerDAO(dataSource: DataSource) {
  val jdbcTemplate = new JdbcTemplate(dataSource)
...
}

Eine Konfiguration dieser Klasse mit XML zeigt Listing 2. Als Datenbank wird unter dem Namen dataSource eine HSQL-Datenbank verwendet. Dann wird eine Instanz der Klasse CustomerDAO erzeugt und als Parameter für den Konstruktor eine Referenz auf die Datenbank übergeben. Bei diesem Ansatz ergeben sich kaum Unterschiede zu Java-Klassen. Allerdings erzeugt Scala keine Getter und Setter. Daher kann das property-Element nicht in der Spring-XML-Konfiguration genutzt werden, das sonst bei Spring das Injizieren mithilfe von Settern erlaubt. Scala bietet aber die @BeanProperty-Annotation, um Getter und Setter zu erzeugen, sodass dieses Problem gelöst werden kann.

Listing 2: Scala DAO in XML

Interessant sind auch die Scala Collections. Sie können mit XML nicht ohne Weiteres konfiguriert werden. Also wird eine Spring-Erweiterung benötigt, wie in Listing 3 dargestellt. Mit Spring Namespaces ist eine solche Ergänzung schnell geschrieben.

Listing 3: Scala Collections in XML
42

Themen der foglenden Seiten:

  • Definition von Spring Beans mithilfe von Java-Klassen
  • Spring JavaConfig mit Scala
  • Spring-Annotationen mit Scala
  • Serviceabstraktion

  • Spring JDBC Callbacks mit Java
  • Spring JDBC mit Scala Funktionen
  • Aspektorientierte Programmierung (AOP)
  • Transactional Funktion
  • Infos zum Autoren
Geschrieben von
Eberhard Wolff
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.