Suchen

Einstieg in Spring Boot, Teil 1 Grundlagen und „Hello World“ in Spring

Autor / Redakteur: Dirk Koller / Stephan Augsten

Das Spring-Framework gehört, genau wie Java, inzwischen eher zum Softwareentwicklungs-Establishment. Dank Erweiterungen wie Spring Boot, das wir in dieser Serie vorstellen, ist es aber immer noch auf der Höhe der Zeit.

Firma zum Thema

Spring greift dem Entwickler unter die Arme, so hilft der Spring-Initializr beim Anlegen von Projekten und der Auswahl der richtigen Komponenten.
Spring greift dem Entwickler unter die Arme, so hilft der Spring-Initializr beim Anlegen von Projekten und der Auswahl der richtigen Komponenten.
(Bild: Spring.io)

Mit der rasanten Fortentwicklung der „jungen Wilden“ wie beispielsweise Node.js kann das Spring Framework nicht mithalten – muss es aber auch nicht. Das Spring-Framework hat in der Backend-Entwicklung, etwa beim Zugriff auf Datenbanken oder bei der Programmierung von Rest-APIs, einen festen Platz.

Der Kern von Spring ist ein Dependency Injection Framework. In diesem werden Objekte nicht mehr vom Entwickler mit dem „new“-Operator erzeugt, sondern lediglich in einer Konfiguration beschrieben. Die Instanziierung der Klassen übernimmt der IoC (Inversion of Control) Container, der in Spring durch den Application Context repräsentiert wird.

Der Vorteil dieses Ansatzes: harte Abhängigkeiten im Code werden vermieden und die Testbarkeit erleichtert. Mit den Jahren ist Spring gewachsen und inzwischen viel mehr als nur dieser Container. Spring Data, Spring MVC, Spring Security, Spring Cloud, Templates für den JDBC- oder Rest-Zugriff, AOP, ORM, WebFlux – die Liste der Features ließe sich noch lange fortführen.

Die wichtigste Erweiterung der letzten Jahre nennt sich „Spring Boot“ und hat die Entwicklerherzen im Sturm erobert. Spring Boot erleichtert die mühsame Konfiguration durch Component Scanning und Autokonfiguration, zwei mächtige Features, die wir uns im Verlauf dieser Serie genauer ansehen werden.

Sammlungen von kuratierten Bibliotheken, die sogenannten Starter, erübrigen das Hantieren mit Versionen und Abhängigkeiten bei der Nutzung bestehender Software. Schließlich arbeitet das Framework mit einem eingebetteten Tomcat-Server, der entwickelte Services blitzschnell startet. In der Summe führt das zu einem gewaltigen Produktivitätsschub und fast noch wichtiger: Es macht eine Menge Spaß!

Initializr

Der Spring-Initializr hilft beim Anlegen des Projekts.
Der Spring-Initializr hilft beim Anlegen des Projekts.
(Bild: Dr. Koller / Spring)

Zum Anlegen eines Spring-Boot-Projekts steht dem Entwickler ein Generator namens Spring Initializr bei. Auf der Seite lassen sich Projekteigenschaften wie Programmiersprache, Spring-Boot-Version und das Build-System (Maven oder Gradle) auswählen. Auch wichtige Bibliotheken wie im Screenshot „Spring Web“ sind mit einem Klick ausgewählt. Das generierte Projekt lädt man im ZIP-Format und kann es nach dem Entpacken in einer IDE wie der Spring Tool Suite (STS) mittels Maven-Import öffnen.

Rundgang durchs Projekt

Der Aufbau des erzeugten Projekts entspricht einem Maven-Projekt.
Der Aufbau des erzeugten Projekts entspricht einem Maven-Projekt.
(Bild: Dr. Koller / Spring)

Der Projektaufbau entspricht dem eines gängigen Maven-Projekts mit den Ordnern „src/main/java“ und „src/main/ressources“. Die interessanteste Datei ist die Maven-Projektdatei pom.xml. Sie enthält einen Verweis auf das Parent-Pom „spring-boot-starter-parent“, von dem sie zahlreiche Eigenschaften erbt. Darunter sind zum Beispiel Default-Konfigurationen für Maven-Plugins und, wiederum vererbt vom Parent „spring-boot-dependencies“, eine Menge an Abhängigkeiten in zueinander passenden Versionen.

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.3.4.RELEASE</version>
   <relativePath/>
</parent>

In den Dependencies, also den eingebundenen Bibliotheken, ist das im Initializr ausgewählte Feature „Spring Web“, auch in Form eines Starters, zu finden.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Daneben stößt man noch auf eine Abhängigkeit „spring-boot-starter-test“ zum Erstellen von Unit-Tests und auf ein Plugin, mit dem sich der Service als ausführbares Jar bauen lässt:

<plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

Neben dem POM ist noch die Application-Klasse interessant. Sie enthält die main-Methode zum Start der Java-Anwendung. In dieser wird die statische Methode „SpringApplication.run“ aufgerufen, die für Bootstrap und Start des Spring-Containers verantwortlich ist.

@SpringBootApplication
public class DemoApplication {
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

Annotationen in Annotationen

Die Annotation @SpringBootApplication ist eine Sammelannotation, die drei einzelne Annotationen zusammenfasst: @Configuration, @EnableAutoConfiguration und @ComponentScan. @Configuration kennzeichnet die Klasse als Konfigurationsklasse. Das heißt in der Klasse lassen sich Beans für den Application Context definieren.

@EnableAutoConfiguration aktiviert die Autokonfiguration, ein Mechanismus von Spring Boot, bei dem aus verschiedenen Merkmalen, wie etwa den zugefügten Bibliotheken, auf den Verwendungszweck geschlossen und erforderliche Beans automatisch konfiguriert werden. Hier wird beispielsweise das Dispatcher Servlet als Front Controller für eingehende Requests konfiguriert, weil im POM die Abhängigkeit zu spring-boot-starter-web enthalten ist.

@ComponentScan aktiviert das automatische Durchsuchen definierter Teile des Classpaths nach Spring-Komponenten. Komponenten sind spezialisierte Klassen wie Controller oder Services. Als solche gekennzeichnete Klassen werden in den Spring-Container geladen, ohne dass dafür eine Bean konfiguriert werden muss.

Die weiteren Dateien sind nicht ganz so entscheidend. In „application.properties“ lassen sich Eigenschaften wie der verwendete Port definieren. „mvnw“ und „mvnw.cmd“ sind Shell- bzw. Windows-Skripte, mit denen sich das Projekt ohne komplette Maven-Installation bauen lässt.

Hello Spring Boot

An der Auswahl des Starters „spring-boot-starter-web“ erkennt Spring Boot, dass hier eine Model-View-Controller- oder kurz MVC-Anwendung gebaut werden soll. Ein eingehender Request (zum Beispiel das Aufrufen einer Seite im Browser) wird dabei an den Front Controller der Anwendung geleitet.

In Spring ist dieser Front Controller das bereits erwähnte Dispatcher Servlet. Es übernimmt den Request und entscheidet anhand einer Routing-Tabelle welche Methode den Request bearbeiten soll. Diese Routing Tabelle fehlt hier noch, sie wird durch Einträge in einer Controller-Klasse erstellt.

Wir legen also eine Controller-Klasse an und annotieren diese mit @Controller. Die Klasse wird damit zur Komponente. Da es in diesem Beispiel um Personen geht, heißt sie „PersonController“. In der Klasse soll eine Methode namens „home“ den Request auf den Pfad „/“ bearbeiten. Der Aufruf der URL in der Adressleiste des Browsers führt zu einem GET-Request, deswegen wird sie mit der Annotation „GetMapping“ gekennzeichnet.

Analoge Mappings existieren auch für die anderen HTTP-Methoden. Schließlich muss Spring noch mitgeteilt werden, dass der Rückgabewert der Methode in die HTTPResponse geschrieben werden soll. Das übernimmt die Annotation @ResponseBody:

@Controller
public class PersonController {
   @GetMapping("/")
   @ResponseBody
   public String home() {
      return "Hello World";
   }
}

Die Anwendung kann nun durch Aufruf der Application-Klasse gestartet werden, sie läuft defaultmäßig unter Port 8080. Beim Start wird automatisch der integrierte Tomcat-Server hochgefahren, auf der Konsole kann man die zugehörigen Meldungen verfolgen.

Ein Aufruf der URL http://localhost:8080 im Browser führt schließlich zur gewünschten Anzeige von „Hello World“. Noch nicht spektakulär, aber ein erstes Lebenszeichen von Spring Boot! Im nächsten Teil der Serie werden wir uns Views mit Thymeleaf anschauen.

(ID:46965374)