Découvrez le framework web Spring Boot qui a la cote !
Apprenez comment son système d'auto-configuration fonctionne.
Live coding et exemple de migration vers Spring Boot sont de la partie.
2. 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
3. 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
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
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!";
}
}
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 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
9. 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
10. 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);
}
}
11. 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
12. 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
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
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
17. 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
18. 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
19. 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)
Notes de l'éditeur
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
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
Encore plus simple en Groovy
Support de Graddle et de Ant
Autres moteurs de templates : Velocity, JSP (pas en JAR exécutable)
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
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
Article complet sur http://javaetmoi.com/2016/08/migrer-vers-spring-boot/
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)