Introduction à
Spring Boot
4 octobre 2016
Objectifs
 Donner envie d’utiliser Spring Boot
 Démystifier le fonctionnement de l’auto-configuration
 Montrer Spring Boot en action
 Partager un retour d’expérience de migration vers Spring Boot
Sommaire
 Les principes de Spring Boot
 Le traditionnel Hello World
 Configuration applicative
 Des tests simplifiés
 Démo : développement d’une application Hello World
 Etudes de cas : migration de l’application Spring Petclinic
 Aperçu des autres fonctionnalités
L’explosion Spring Boot
Les idées fortes
 Accélérer le développement d’applications Spring
 Convention over Configuration
 Pas de code généré
 Déploiement facilité
 Prêt pour la production
Hello World
 Application REST = 1 classe Java +1 pom.xml
@SpringBootApplication
@RestController
public class HelloWorld {
public static void main(String[] args) {
SpringApplication.run(HelloWorld.class, args);
}
@RequestMapping("/")
public String hello() {
return "Hello World!";
}
}
Technologies supportées
 Core : Spring Security, JTA, Spring Cache, Spring Session
 Web : Spring MVC, Websocket, Jersey, Mobile, HATEOS
 Moteurs de templates : Freemaker, Thymeleaf, Groovy, Mustache
 Database
 SGBDR : Spring Data JPA, JDBC, JOOQ
 NoSQL : Redis, MongoDB, Elasticsearch, Cassandra
 La suite Spring Cloud : Eureka, Hystrix, Turbine, AWS, OAuth2
 I/O : Spring Batch et Integration, JavaMail, Camel, JMS, AMQP
 Social : Facebook, Linkedin, Twitter
Auto-configuration (1/2)
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
 L’annotation @SpringBootApplication déclenche la configuration
automatique de l’infrastructure Spring
 Au démarrage de l’application, Spring Boot :
 Scanne toutes classes de @Configuration
 Classes de configuration spécifiques à l’application
 Classes de Spring Boot suffixées par AutoConfiguration (110 dans Spring Boot 1.4.1)
 3rd party starters
 Utilise les JAR présents dans le classpath pour prendre des décisions
Auto-configuration (2/2)
 Repose sur des activations conditionnelles
 @Conditional, @ConditionalOnProperty, @ConditionalOnClass,
@ConditionalOnMissingClass ,@ConditionalOnMissingBean ,
@ConditionalOnWebApplication, @ConditionalOnNotWebApplication,
@ConditionalOnExpression
 Possibilité de créer sa propre librairie auto-configurable
Auto-configuration de Spring JDBC
@Configuration
@ConditionalOnClass({ DataSource.class, JdbcTemplate.class })
@ConditionalOnSingleCandidate(DataSource.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class JdbcTemplateAutoConfiguration {
private final DataSource dataSource;
public JdbcTemplateAutoConfiguration(DataSource dataSource) {
this.dataSource = dataSource;
}
@Bean
@Primary
@ConditionalOnMissingBean(JdbcOperations.class)
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(this.dataSource);
}
@Bean
@Primary
@ConditionalOnMissingBean(NamedParameterJdbcOperations.class)
public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
return new NamedParameterJdbcTemplate(this.dataSource);
}
}
Auto-configuration de la DataSource
 Complexité de DataSourceAutoConfiguration
 Récupération de la DataSource par JNDI
 Choix du pool de connexions : Tomcat, HikariCP, Commons DBCP 1 ou 2
 Paramétrage de la connexion à la base de données
 Configuration application.properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 Base de données embarquée par analyse des JAR dans le classpath
 Support du XA
 Exposition du pool via JMX
Configuration applicative
 Centralisée dans
 application.properties
 ou application.yml
 Complétion dans l’IDE
 Configuration extensible et TypeSafe
 @ConfigurationProperties
 Possibilité de configuration spécifique à un environnement de déploiement
 java -jar myapp,jar --spring.profiles.active=production
 Charge application-production.properties
Des tests auto-configurés
 Le starter spring-boot-starter-test tire les frameworks de test :
JUnit, Spring Test, AssertJ, Mockito, JsonPath, JSONassert et Hamcrest.
 Fonctionnalité de « test slicing »
 Permet de segmenter les tests : couche présentation, contrôleurs REST, DAO …
 Spring Boot se charge de créer un contexte applicatif dédié
 Jeu d’annotations : @WebMvcTest, @JsonTest, @DataJpaTest, @RestClientTest
 Possibilité de créer son propre slice (ex: @DataJdbcTest)
 Création automatique de simulacres avec @MockBean
 Pour les tests d’intégration, @SpringBootTest permet de démarrer un
conteneur de servlet
@RunWith(SpringRunner.class)
@WebMvcTest(OwnerController.class)
public class OwnerControllerTests {
@Autowired
private MockMvc mockMvc;
@MockBean
private ClinicService clinicService;
@Test
public void testDisplayOwner() throws Exception {
Owner george = new Owner(1, "George", "Franklin");
given(this.clinicService.findOwnerById(1)).willReturn(george);
mockMvc.perform(get("/owners/{ownerId}", 1))
.andExpect(status().isOk())
.andExpect(model().attribute("owner", hasProperty("lastName", is("Franklin"))))
.andExpect(model().attribute("owner", hasProperty("firstName", is("George"))))
.andExpect(view().name("owners/ownerDetails"));
}
}
Exemple de test unitaire
Initialisation d’un contexte applicatif
web scannant les beans Spring MVC et
configuration du MockMvc
Simulacre Mockito enregistré dans le
contexte applicatif Spring et mis à
disposition par auto-wiring
Alias pour SpringJUnit4ClassRunner
Live coding
 Utilisation de Spring Initializr depuis IntelliJ : WEB, JPA, thymeleaf
 Utilisation de la base de données H2
 Création d’un service REST HelloWorld
 Configuration du logger
 Migration Tomcat vers Jetty
 Démo des actuators
 Personnalisation de la bannière
 Exécution d’un JAR auto-exécutable
 Changement de port par configuration, paramètre et profile Spring
Etudes de cas : migration Spring Petclinic
Et plein d’autres fonctionnalités
 Personnalisation de la bannière de démarrage
 Prêt pour la Production
 Initialisation de bases de données
 Exécution de jobs Spring Batch
 Shell remote (CRaSH)
 Spring Boot CLI
 Utiliser Jetty ou Undertow à la place de Tomcat
 Live Reload & Hot swapping
 Installation sous forme de service Linux ou Windows
Conclusion
 Permet de mettre en place rapidement une application
Java basée sur Spring
 Diminue drastiquement la configuration Spring
 Peut remplacer un socle d’Entreprise
 Dites adieu aux bons vieux gros serveurs d’applications
 Make JAR not WAR
Ressources
 Manuel de référence de Spring Boot (Pivotal)
 Spring Boot 1.3 pour le web (S. Nicoll et B. Clozel)
 Bootiful Microservice (Josh Long)
 Migrer vers Spring Boot (Antoine Rey)
 Custom test slice with Spring Boot 1.4 (S. Nicoll)
 Spring Guides (Pivotal)

Introduction à spring boot

  • 1.
  • 2.
    Objectifs  Donner envied’utiliser Spring Boot  Démystifier le fonctionnement de l’auto-configuration  Montrer Spring Boot en action  Partager un retour d’expérience de migration vers Spring Boot
  • 3.
    Sommaire  Les principesde Spring Boot  Le traditionnel Hello World  Configuration applicative  Des tests simplifiés  Démo : développement d’une application Hello World  Etudes de cas : migration de l’application Spring Petclinic  Aperçu des autres fonctionnalités
  • 4.
  • 5.
    Les idées fortes Accélérer le développement d’applications Spring  Convention over Configuration  Pas de code généré  Déploiement facilité  Prêt pour la production
  • 6.
    Hello World  ApplicationREST = 1 classe Java +1 pom.xml @SpringBootApplication @RestController public class HelloWorld { public static void main(String[] args) { SpringApplication.run(HelloWorld.class, args); } @RequestMapping("/") public String hello() { return "Hello World!"; } }
  • 7.
    Technologies supportées  Core: Spring Security, JTA, Spring Cache, Spring Session  Web : Spring MVC, Websocket, Jersey, Mobile, HATEOS  Moteurs de templates : Freemaker, Thymeleaf, Groovy, Mustache  Database  SGBDR : Spring Data JPA, JDBC, JOOQ  NoSQL : Redis, MongoDB, Elasticsearch, Cassandra  La suite Spring Cloud : Eureka, Hystrix, Turbine, AWS, OAuth2  I/O : Spring Batch et Integration, JavaMail, Camel, JMS, AMQP  Social : Facebook, Linkedin, Twitter
  • 8.
    Auto-configuration (1/2) @SpringBootApplication public classDemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }  L’annotation @SpringBootApplication déclenche la configuration automatique de l’infrastructure Spring  Au démarrage de l’application, Spring Boot :  Scanne toutes classes de @Configuration  Classes de configuration spécifiques à l’application  Classes de Spring Boot suffixées par AutoConfiguration (110 dans Spring Boot 1.4.1)  3rd party starters  Utilise les JAR présents dans le classpath pour prendre des décisions
  • 9.
    Auto-configuration (2/2)  Reposesur des activations conditionnelles  @Conditional, @ConditionalOnProperty, @ConditionalOnClass, @ConditionalOnMissingClass ,@ConditionalOnMissingBean , @ConditionalOnWebApplication, @ConditionalOnNotWebApplication, @ConditionalOnExpression  Possibilité de créer sa propre librairie auto-configurable
  • 10.
    Auto-configuration de SpringJDBC @Configuration @ConditionalOnClass({ DataSource.class, JdbcTemplate.class }) @ConditionalOnSingleCandidate(DataSource.class) @AutoConfigureAfter(DataSourceAutoConfiguration.class) public class JdbcTemplateAutoConfiguration { private final DataSource dataSource; public JdbcTemplateAutoConfiguration(DataSource dataSource) { this.dataSource = dataSource; } @Bean @Primary @ConditionalOnMissingBean(JdbcOperations.class) public JdbcTemplate jdbcTemplate() { return new JdbcTemplate(this.dataSource); } @Bean @Primary @ConditionalOnMissingBean(NamedParameterJdbcOperations.class) public NamedParameterJdbcTemplate namedParameterJdbcTemplate() { return new NamedParameterJdbcTemplate(this.dataSource); } }
  • 11.
    Auto-configuration de laDataSource  Complexité de DataSourceAutoConfiguration  Récupération de la DataSource par JNDI  Choix du pool de connexions : Tomcat, HikariCP, Commons DBCP 1 ou 2  Paramétrage de la connexion à la base de données  Configuration application.properties spring.datasource.driver-class-name=com.mysql.jdbc.Driver  Base de données embarquée par analyse des JAR dans le classpath  Support du XA  Exposition du pool via JMX
  • 12.
    Configuration applicative  Centraliséedans  application.properties  ou application.yml  Complétion dans l’IDE  Configuration extensible et TypeSafe  @ConfigurationProperties  Possibilité de configuration spécifique à un environnement de déploiement  java -jar myapp,jar --spring.profiles.active=production  Charge application-production.properties
  • 13.
    Des tests auto-configurés Le starter spring-boot-starter-test tire les frameworks de test : JUnit, Spring Test, AssertJ, Mockito, JsonPath, JSONassert et Hamcrest.  Fonctionnalité de « test slicing »  Permet de segmenter les tests : couche présentation, contrôleurs REST, DAO …  Spring Boot se charge de créer un contexte applicatif dédié  Jeu d’annotations : @WebMvcTest, @JsonTest, @DataJpaTest, @RestClientTest  Possibilité de créer son propre slice (ex: @DataJdbcTest)  Création automatique de simulacres avec @MockBean  Pour les tests d’intégration, @SpringBootTest permet de démarrer un conteneur de servlet
  • 14.
    @RunWith(SpringRunner.class) @WebMvcTest(OwnerController.class) public class OwnerControllerTests{ @Autowired private MockMvc mockMvc; @MockBean private ClinicService clinicService; @Test public void testDisplayOwner() throws Exception { Owner george = new Owner(1, "George", "Franklin"); given(this.clinicService.findOwnerById(1)).willReturn(george); mockMvc.perform(get("/owners/{ownerId}", 1)) .andExpect(status().isOk()) .andExpect(model().attribute("owner", hasProperty("lastName", is("Franklin")))) .andExpect(model().attribute("owner", hasProperty("firstName", is("George")))) .andExpect(view().name("owners/ownerDetails")); } } Exemple de test unitaire Initialisation d’un contexte applicatif web scannant les beans Spring MVC et configuration du MockMvc Simulacre Mockito enregistré dans le contexte applicatif Spring et mis à disposition par auto-wiring Alias pour SpringJUnit4ClassRunner
  • 15.
    Live coding  Utilisationde Spring Initializr depuis IntelliJ : WEB, JPA, thymeleaf  Utilisation de la base de données H2  Création d’un service REST HelloWorld  Configuration du logger  Migration Tomcat vers Jetty  Démo des actuators  Personnalisation de la bannière  Exécution d’un JAR auto-exécutable  Changement de port par configuration, paramètre et profile Spring
  • 16.
    Etudes de cas: migration Spring Petclinic
  • 17.
    Et plein d’autresfonctionnalités  Personnalisation de la bannière de démarrage  Prêt pour la Production  Initialisation de bases de données  Exécution de jobs Spring Batch  Shell remote (CRaSH)  Spring Boot CLI  Utiliser Jetty ou Undertow à la place de Tomcat  Live Reload & Hot swapping  Installation sous forme de service Linux ou Windows
  • 18.
    Conclusion  Permet demettre en place rapidement une application Java basée sur Spring  Diminue drastiquement la configuration Spring  Peut remplacer un socle d’Entreprise  Dites adieu aux bons vieux gros serveurs d’applications  Make JAR not WAR
  • 19.
    Ressources  Manuel deréférence de Spring Boot (Pivotal)  Spring Boot 1.3 pour le web (S. Nicoll et B. Clozel)  Bootiful Microservice (Josh Long)  Migrer vers Spring Boot (Antoine Rey)  Custom test slice with Spring Boot 1.4 (S. Nicoll)  Spring Guides (Pivotal)

Notes de l'éditeur

  • #5 Source : https://zeroturnaround.com/rebellabs/java-tools-and-technologies-landscape-2016-trends/ Sprint Boot 1.0 est sorti en 2013 http://www.indeed.com/jobtrends/q-spring-and-boot.html
  • #6 Convention over Configuration : Opinionated view of the Spring platform and third-party libraries. Plus ou peu de configuration Spring. Pas de code généré : pas de code Java ni de configuration XML ou Java Déploiement facilité : pas de serveur à installer, exécution d’un JAR auto-exécutable avec un java –jar myappli.jar, serveur Jetty/Undertow/Tomcat embarqué Prêt pour la production : configuration externalisée, profils de conf, surcharge de conf, monitoring (actuator), services Windows et Linux, support du CORS, remote shell Mais également : Spring Boot gère pour vous la version des frameworks compatibles les uns avec les autres
  • #7 Encore plus simple en Groovy Support de Graddle et de Ant
  • #8 Autres moteurs de templates : Velocity, JSP (pas en JAR exécutable)
  • #12 DataSourceAutoConfiguration : https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java EmbeddedDatabaseConnection : https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/EmbeddedDatabaseConnection.java
  • #13 java -jar myapp,jar --spring.profiles.active=production
  • #14 https://spring.io/blog/2016/08/30/custom-test-slice-with-spring-boot-1-4
  • #15 Exemple créé à partir de la classe https://github.com/spring-projects/spring-petclinic/blob/springboot/src/test/java/org/springframework/samples/petclinic/web/OwnerControllerTests.java @WebMvcTest recherche les beans @Controller, @ControllerAdvice, @JsonComponent, Filter, WebMvcConfigurer et HandlerMethodArgumentResolver
  • #16 1. GÈnÈrer un projet avec Spring Initializr depuis IntelliJ Choisir web, JPA, thymeleaf   2. Ajout la dÈpendance vers h2 dans le pom.xml <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> 3. CrÈation de la classe Hello public class Hello {   private final long id; private final String name;   public Hello(long id, String name) { this.id = id; this.name = name; }   public long getId() { return id; }   public String getName() { return name; } }   4. Ajout du contrÙleur @RestController public class HelloController {   private static final String template = "Hello, %s!"; private final AtomicLong counter = new AtomicLong();   @RequestMapping("/hello/{name}") public Hello sayHello(@PathVariable String name) { return new Hello(counter.incrementAndGet(), String.format(template, name));   } } 5. Configuration du application.properties logging.level.org.springframework.web=INFO     6. Utilisation de Jetty ‡ la place de Tomcat Modification du pom.xml : <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>   7. Utilisation des actuators Ajout dans le pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 8. Ajout d'informations   ComplÈeter application.properties : info.exemple=Test Puis http://localhost:8082/info   Ajout via maven : <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <!-- Spring Boot Actuator displays build-related information if a META-INF/build-info.properties file is present --> <goals> <goal>build-info</goal> </goals> <configuration> <additionalProperties> <encoding.source>${project.build.sourceEncoding}</encoding.source> <encoding.reporting>${project.reporting.outputEncoding}</encoding.reporting> <java.source>${maven.compiler.source}</java.source> <java.target>${maven.compiler.target}</java.target> </additionalProperties> </configuration> </execution> </executions> </plugin>       9. Personnalisation de la banniËre avec Duke   10. DÈmarrage du JAR java -jar target/demo-0.0.1-SNAPSHOT.jar   11. Changement de port par configuration, paramËtre et profile Spring --server.port=9090 application-prod.properties et --spring.profiles.active=prod      
  • #17 Article complet sur http://javaetmoi.com/2016/08/migrer-vers-spring-boot/
  • #18 Prêt pour la Production : health-check, monitoring, pistes d’audit, métriques => actuator Initialisation de base de données : Flyway et Liquibase. CRaSH permet de connecter à l’application en ssh ou telnet Spring Boot CLI : outils en ligne de commande permetta,t d’exéciton des scripts Groovy. Exemple : spring run app.groovy Service Linux : support de Systemd et init.d (System V)