View
243
Download
2
Category
Preview:
Citation preview
SPRING BOOTWird Spring jetzt wirklich einfach?
Jens Presser
INHALTE1. Hintergrund2. Was ist Spring Boot?3. Wie funktioniert es?4. Demo
HINTERGRUND
Herausforderungen
DependenciesVersionenSpring KomponentenSpring Klassenhohe Lernkurve"selbstgemachte" Spring-Konfigurationen
yeah, sure, you just connect your TransactionAwareConnectionFactoryProxyto your UserCredentialsConnectionFactoryAdapter to your ..
Folgen
BoilerplateGoogle/Stackoverflow Driven DevelopmentCopy&Paste aus anderen Projekten
WAS IST SPRING BOOT?
Spring Boot Mission Statement
Spring Boot makes it easy to create stand-alone, production-grade Spring based
Applications that you can "just run". We takean opinionated view of the Spring platform
and third-party libraries so you can getstarted with minimum fuss. Most Spring Boot
applications need very little Springconfiguration.
Ziele
Vereinfachung von Spring ProjektenOut-of-the-box VerhaltenNichtfunktionale Features bspw. Embedded Servers, Healthchecks, Metrics, Externalized Configuration
Optimierungen in Richtung:MicroservicesCloud-basierte Applikationen12 factor applications
Exkurs: 12 factor applications
one codebase, many deploysexplicit dependenciesconfiguration in environmentbacking services as attached resourcesseparate build, release and run stagesstateless processexport service via port bindingscale out as processesrobustness with fast startup times, graceful shutdownkeep dev and prod as similar as possiblelogs as event streams (stdout)admin/management tasks as one-off processes
Features
Dependency Management Maven/GradleAutoConfigurationConvention over ConfigurationExternalisierte KonfigurationProfileAusführbare ArtefakteKeine Bytecode Manipulation oder Codegenerierung
WIE FUNKTIONIERT ES?
Spring Initializr
Generator für Spring Boot ProjekteSelektion von Spring Boot KomponentenParametriert durch:
Artefakt-Koordinaten (group, artifact)PackagingJava/Spring Boot VersionSprache (Java/Groovy)
http://start.spring.io/
Spring Boot Starters
"POM" Projekte für definierte Sets von DependenciesDepencency ManagementZugriff auf:
Spring Portfolio Module z.B. Web, Security, Data
3rd Party z.B. Activiti, Stormpath
Eigene Starters
Spring Boot Plugins
Plugins für Build-Tools Maven und GradleDependecy (Version) ManagementSelf-executable JARs
enhalten abhängige JARseigener Classloader und Main Klasse
Ausführbarkeit aus dem Build-Tool:
java -jar target/my-spring-boot-demo.jar
mvn spring-boot:run
gradle bootRun
Spring Booting...
package com.example.myproject;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
... that's all!
AutoConfiguration
Vorgefertigte Spring @ConfigurationsCondition und @Conditional@ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnWebApplication
@Configuration @ConditionalOnClass(ObjectMapper.class) @ConditionalOnBean(ObjectMapper.class) protected class MappingJackson2HttpMessageConverterConfiguration { @Bean @ConditionalOnMissingBean public MappingJackson2HttpMessageConverter mj2hmc(ObjectMapper objectMapper) { // pseude code, der Name ist zu lang ;-) MappingJackson2HttpMessageConverter converter = new MJ2HMC(objectMapper); if (this.properties.isJsonPrettyPrint() != null) { converter.setPrettyPrint(this.properties.isJsonPrettyPrint()); } return converter; } }
Externalized Configuration
Spring Boot DefaultsPropertySources in @Configurationapplication.properties in JAR / externapplication-{profile}.properties in JAR / externUmgebungsvariablen
System-Properties
SPRING_APPLICATION_JSON UmgebungsvariableCLI Argumente
SERVER_PORT=8080
-Dserver.port=8080
--server.port=8080
YAML Format für Konfigurationsdateien (application.yml)Property Placeholder
profilspezifische Konfigurationsdateienapplication.propertiesapplication-default.propertiesapplication-[profile].properties
Typsicherheit, Casting, Namespacing via@ConfigurationProperties
prop.message=Hello ${prop.name}!
spring.profiles.active=prod spring.profiles.include=proddb,prodmq
@ConfigurationProperties
@Component @ConfigurationProperties(prefix="connection") public class ConnectionSettings { private String username; private InetAddress remoteAddress; // ... getters and setters }
@Autowired private ConnectionSettings connection;
connection.username=demo connection.remoteAddress=192.168.0.1
Logging
Vordefinierte DefaultsFormate, Loglevel, Appender etc. konfiguriertDefault: Nur CONSOLE AusgabeERROR, WARN, INFO⇒ Keine Log-Konfigurationsdatei nötig
Log-Konfiguration
Logdatei kann aktiviert werden
Debug über Flag aktivierbar
Log-Level
Log Pattern
logging.file=demo.log logging.path=/data/demo-app/
--debug -Ddebug=true
logging.level.my.package=DEBUG
logging.pattern.console=... logging.pattern.file=...
DevTools
Default-Properties für Development z.B. spring.thymeleaf.cache=false
Automatic RestartLiveReload Browser SupportRemote Debug Tunneling (via HTTP[S])Remote Update and Restart
Actuators
production ready featuresHealthChecks z.B. Connections zu DB, MQ oder Diskspace …
Metrics und Metric Export z.B. Uptime, Requests, Memory, Pools, Cache, GC, Heap …
Weitere Endpoints: info, env, dump, shutdown …
JMX (over HTTP)Remote ShellAuditingPID und Port Dateien
Caveat
KonventionenAutoConfigurationUmgebungsvariablenDefault: Single ConnectionFramework für ein Framework
DEMO TIME
Fazit
IMHO
Schnelles AufsetzenSinnige Defaults80:20 RegelPrototyping?Kenntnis der Konventionen/Automatismen
VIELEN DANK FÜR EURE AUFMERKSAMKEIT!Fragen oder Anmerkungen?
Referenzen
Spring Boot Referencespring-boot@githubSimplifying Spring for EveryoneUnder the BootHow not to hate Spring in 2016Why I hate Spring
Recommended