Custom Annotation bei Spring AOP Pointcut-Definition

AOP (Aspektorientierte Programmierung) ist ein Programmierparadigma, das die objektorientierte Programmierung erweitert. Es werden Querschnittsbelange wie z. B. Caching, Security, Transaktionen und Auditierung gekapselt, die das System an mehreren Stellen benötigt. Diese Funktionalitäten werden nicht an mehreren Stellen (Klassen, Methoden) wiederholt implementiert, sondern an eine zentrale Stelle ausgelagert. Die ausgelagerte Funktionalität wird zur Compile- oder Laufzeit an den Stellen hinzugefügt, an denen sie gebraucht wird. Die Menge dieser Stellen nennt man Pointcut.

Bei der Entwicklung von Spring AOP wird folgendes Pattern für die Pointcut-Definition benutzt: execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?). Es ist manchmal schwierig, ein gemeinsames Pattern für alle Methoden, die gematcht werden sollen, zu finden. In so einem Fall empfiehlt sich eine elegantere Variante und zwar die Erstellung einer eigenen Annotation, wie zum Beispiel @Transactional für die Pointcut-Definition.
Continue reading

Posted in Uncategorized | Leave a comment

Ein Einblick in Progressive Web Apps

Die Idee hinter Progressive Web Apps ist einfach und brillant: Man nutzt einen sogenannten Service Worker und lässt diesen als Proxy zwischen der Webseite und dem eigentlichen Server laufen. Das heißt, dass alle Abfragen, die Ressourcen laden, durch den Service Worker gelangen, bevor die eigentliche Übertragung über das Internet stattfindet. Der Service Worker hat direkten Zugriff auf einen Cache und kann sämtliche Ressourcen einer Webseite darin speichern. Somit ist es möglich, Webseiten und Dienste offline verfügbar zu machen, sodass Benutzer jederzeit – egal ob mit, ohne oder nur wenig Internet – die Webseite nutzen können.
Continue reading

Posted in Web as a Platform | Tagged | 4 Comments

Hibernate 5.2 erschienen

Das kürzlich erschienene Hibernate 5.2 benötigt zur Laufzeit nun mindestens Java 8. Dieser große Schritt ist für Minor-Releases sonst eher unüblich. Man will damit in Vorbereitung auf Hibernate 6 schon mal alte Zöpfe abschneiden. Das bisherige hibernate-java8 Modul wurde entfernt und die Logik in den Hibernate Core übernommen. Damit werden nun die Java 8 Date/Time Datentypen nativ als Query-Parameter unterstützt. Des Weiteren können Abfrage-Ergebnisse als Stream zurückgeliefert werden. Methoden, die null zurückgeben dürfen, unterstützen jetzt auch die Klasse Optional.

Der JPA-Support wurde ebenfalls in das Hibernate Core übernommen. Das Modul hibernate-entitymanager entfällt damit auch. Des Weiteren kann nun jede JCache-konforme Implementierung als Second Level Cache eingesetzt werden.

Eine genaue Anleitung findet man im Migration Guide.

Posted in Java EE, Java Persistence | Tagged , , , , , | Leave a comment

Profilbasierte Verwendung von Spring-Liquibase

In diesem Post geht es darum, wie man die Liquibase-Bean für Tests benutzt, ohne jedoch das Produktivsystem automatischen Schema-Änderungen zu unterwerfen. Für Tests soll hierbei H2 Embedded benutzt werden und für den Produktivbetrieb eine PostgreSQL-Datenbank.

Die Problematik, die sich hierbei ergibt, ist, Liquibase zwischen der Erzeugung der DataSource und der EntityManagerFactory auszuführen, aber nur im Test-Profil.

Sofern dies gelöst ist, ist es möglich, Tests unabhängig durchzuführen. Die Tests erstellen hierbei die Datenbank per Spring und Liquibase bei jeder Ausführung neu.

Daraus ergibt sich, dass die Tests immer das neuste Schema sehen und keine Datenbank für Tests manuell gepflegt werden muss.

Continue reading

Posted in Java Persistence, Spring Universe | Tagged , , , | Leave a comment

Liquibase: Best Practices

Liquibase ist ein System, um Datenbankschema-Änderungen festzuhalten und per SCM nachvollziehen zu können. Diese Änderungen können in XML, YAML, JSON oder SQL geschrieben werden und enthalten datenbankunabhängige Anweisungen. Liquibase kümmert sich dann darum, die Konvertierung für die jeweilige Datenbank zu übernehmen.

liquibase_logo

Zudem kann es Migrations-Skripte erstellen, oder eingebettet als Anwendungsbestandteil die Datenbank direkt (beim Hochfahren der Anwendung) auf den aktuellen Stand bringen.

Im Folgenden stelle ich meine persönlichen Empfehlungen bei der Verwendung von Liquibase vor:

Continue reading

Posted in Did you know?, Java Persistence | Tagged , , , | 1 Comment

Java 8 Lambdas unter der Lupe

Mit Java 8 kam das wohl größte Update für Java SE. Dabei gab es sowohl Neuerungen in der Sprache (Lambdas, Default-Methoden, …), in der Klassen-Bibliothek (Streams), als auch in der JVM. Die Lambda-Ausdrücke sind eine Art Grundlage für viele der neuen Funktionalitäten. Zudem ermöglichen sie uns, auf eine funktionale Art und Weise zu programmieren. Genau genommen ist ein Lambda-Ausdruck ein Code-Block, der im Gegensatz zu Methoden/Funktionen aber keinen Namen hat. Es handelt sich also um eine anonyme Funktion, die man über Variablen referenzieren und Methoden als Parameter mit- bzw. von dort zurückgeben kann. Bei der Definition eines Lambda-Ausdrucks wird der Inhalt noch nicht ausgeführt, kann aber anschließend beliebig oft aufgerufen werden.

Mit der Einführung der Lambda-Ausdrücke wurde Java zwar nicht gleich eine funktionale Programmiersprache. Aber allein die Möglichkeit, auf funktionale Art und Weise zu programmieren, ermöglicht es uns, besser lesbaren und verständlicheren Code zu schreiben. Zudem bietet es auch Vorteile in der nebenläufigen Programmierung. Das wird im Zeitalter von Multicore- und Multiprozessor-Hardware immer wichtiger.

Continue reading

Posted in Java and Quality, Java Basics | Tagged , , , , | Leave a comment

Android Instant Apps vs. Progressive Web Apps

Two days ago, Google announced so called Android Instant Apps at the Google I/O 2016. Android Instant Apps are Android apps which could replace mobile websites. They open by clicking a URL and do not need to be installed. But Android Instant Apps are not the first idea of Google to provide a smooth transition between apps and the web. Some of you might have heard about Progressive Web Apps which were announced back in 2014 on the Chrome Dev Summit. The idea behind Progressive Web Apps is similar to Android Instant Apps. You open a link, and you will get the look and feel of a native app.

In this post we’ll take a quick look at both technologies and clarify where they distinguish.

Continue reading

Posted in Web as a Platform | Tagged , , , , | Leave a comment