Andere delen in de serie:
Spring Boot maakt het gemakkelijk om stand-alone Spring-gebaseerde applicaties van productiekwaliteit te creëren die we ‘gewoon kunnen draaien’ en geeft de voorkeur aan conventie boven configuratie. We kunnen Spring Boot gebruiken om Java-applicaties te maken die kunnen worden gestart met java -jar
. We kunnen een op zichzelf staande HTTP-server maken met embedded Tomcat, Jetty of Undertow (merk op dat we ook Spring Boot-applicaties kunnen implementeren in elke Servlet 3.0+ compatibele container). De meeste webapplicaties zullen de spring-boot-starter-web
module gebruiken om snel aan de slag te gaan. De Spring Boot-starters (in het bijzonder spring-boot-starter-web
) gebruiken Tomcat standaard als een embedded container. Diverse eigenschappen kunnen worden opgegeven in het bestand application.properties
of als schakelopties voor de opdrachtregel.
Set-up Spring Boot
Om Spring Boot op te zetten, beginnen we met het Maven POM-bestand, bijvoorbeeld
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.0.M3</version>
</parent>
<!-- Add dependencies -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-jmx</artifactId>
</dependency>
</dependencies>
<!-- Package as an executable jar -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
</project>
Starter-POM’s zijn een reeks handige afhankelijkheidsdescriptors die we in de applicatie kunnen opnemen. We krijgen een one-stop-shop voor alle Spring en aanverwante technologie die we nodig hebben, zonder door voorbeeldcode te hoeven zoeken en ladingen van afhankelijkheidsdescriptorelementen te kopiëren en plakken:
spring-boot-starter-web
: ondersteuning voor full-stack webontwikkeling, inclusief de embedded servlet container Tomcat en spring-webmvc.spring-boot-starter-actuator
: productieklare functies om te helpen bij het bewaken en beheren van de applicatie.
Spring Integration biedt abstracties over berichten en ook andere transporten zoals HTTP, TCP enzovoort. Statistieken zullen over JMX worden gepubliceerd als spring-integration-jmx
ook op het klassenpad staat (meer informatie is hier te vinden).
Voorbeeld
Als voorbeeld gebruiken we de volgende code
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@EnableAutoConfiguration
public class Example {
private Random generator = new Random();
@RequestMapping("/")
String home() {
return Long.toString(Math.abs(generator.nextLong()), 36);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Example.class, args);
}
}
De eerste annotatie, @RestController
, staat bekend als een stereotype annotatie. Het biedt hints voor mensen die de code lezen, en voor Spring, dat de klasse een specifieke rol speelt. In dit geval is de klasse een web @Controller
, dus Spring zal er rekening mee houden bij het afhandelen van inkomende webverzoeken. De annotatie @RequestMapping
biedt routeringsinformatie. Het vertelt Spring dat elk HTTP-verzoek met het pad /
moet worden toegewezen aan de home
-methode. De @RestController
-annotatie vertelt Spring om de resulterende string direct terug te geven aan de caller. Meer informatie vind je hier.
De tweede annotatie op klasseniveau is @EnableAutoConfiguration
. Deze annotatie vertelt Spring Boot om te ‘raden’ hoe we Spring willen configureren, op basis van de jar-afhankelijkheden die we hebben toegevoegd. Sinds spring-boot-starter-web
Tomcat en Spring MVC heeft toegevoegd, gaat de automatische configuratie ervan uit dat we een webapplicatie ontwikkelen en stelt Spring dienovereenkomstig in.
Het laatste deel van de applicatie is de belangrijkste methode. Dit is slechts een standaardmethode die de Java-conventie volgt voor een toepassingsingangspunt. Onze belangrijkste methode delegeert naar de SpringApplication
-klasse van Spring Boot door run aan te roepen. SpringApplication
zal onze applicatie opstarten, waarbij Spring wordt gestart, die op zijn beurt de automatisch geconfigureerde Tomcat-webserver start. We moeten Example.class
als argument doorgeven aan de run-methode om SpringApplication
te vertellen wat de primaire Spring-component is. De args
-array wordt ook doorgegeven om eventuele opdrachtregelargumenten weer te geven.
Creëer een deployment artefact
Om een deployment artefact te maken, maken we een MANIFEST.MF
met de volgende inhoud
Manifest-Version: 1.0
Class-Path: spring-webmvc-4.2.0.RELEASE.jar spring-integration-core-4.
2.0.M2.jar spring-boot-starter-validation-1.3.0.M3.jar jackson-core-2
.6.1.jar log4j-over-slf4j-1.7.12.jar logback-classic-1.1.3.jar jackso
n-databind-2.6.1.jar jcl-over-slf4j-1.7.12.jar spring-boot-starter-to
mcat-1.3.0.M3.jar tomcat-embed-core-8.0.23.jar aopalliance-1.0.jar sp
ring-aop-4.2.0.RELEASE.jar spring-boot-starter-1.3.0.M3.jar spring-bo
ot-autoconfigure-1.3.0.M3.jar spring-boot-1.3.0.M3.jar jackson-annota
tions-2.6.1.jar spring-expression-4.2.0.RELEASE.jar spring-tx-4.2.0.R
ELEASE.jar spring-context-4.2.0.RELEASE.jar tomcat-embed-el-8.0.23.ja
r hibernate-validator-5.2.1.Final.jar spring-integration-jmx-4.2.0.M2
.jar tomcat-embed-logging-juli-8.0.23.jar spring-web-4.2.0.RELEASE.ja
r jul-to-slf4j-1.7.12.jar snakeyaml-1.15.jar spring-retry-1.1.2.RELEA
SE.jar logback-core-1.1.3.jar classmate-1.1.0.jar validation-api-1.1.
0.Final.jar spring-core-4.2.0.RELEASE.jar jboss-logging-3.2.1.Final.j
ar slf4j-api-1.7.12.jar spring-boot-starter-actuator-1.3.0.M3.jar spr
ing-beans-4.2.0.RELEASE.jar spring-boot-actuator-1.3.0.M3.jar tomcat-
embed-websocket-8.0.23.jar spring-messaging-4.2.0.RELEASE.jar spring-
boot-starter-web-1.3.0.M3.jar spring-boot-starter-logging-1.3.0.M3.ja
r
Main-Class: Example
Het resulterende .jar
-bestand heeft de volgende inhoud
/META-INF
MANIFEST.MF
Example.class
Om het .jar
-bestand uit te voeren kunnen we het volgende gebruiken
./java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /opt/docker/custom-containers/springboot-example/jars/springboot.jar
waarin de opties Flight Recorder en JMX zijn toegevoegd voor monitoringdoeleinden.