#backdaybyxebia
Nicolas Jozwiak
Thomas Auffredou
Construire le SI de demain
Spring boot
#backdaybyxebia
@tauffredou
@njozwiak
#backdaybyxebia
Initié par
Phillip Webb : @phillip_web
et
Dave Syer : @david_syer
#backdaybyxebia
Dernière release GA : 1.2.3
(Mars 2015)
#backdaybyxebia
Se frayer un chemin dans la galaxie Spring
Objectifs
#backdaybyxebia
●  Démarrer rapidement
●  Convention over configuration
●  Orienté ops (métriques, configuration, ...)
●  Pas de génération de code (contrairement à SpringRoo)
Objectifs
#backdaybyxebia
Exemple Groovy
@RestController
class SampleApplication
{
@RequestMapping("/")
String home() {
"Hello World!"
}
}
$spring run app.groovy
#backdaybyxebia
Présentation
●  Prérequis faibles : jdk >= 1.6, maven >= 3.1, gradle >= 1.6
●  Repose sur les nouveautés de Spring 4
●  Orientation architecture standalone / microservices
#backdaybyxebia
@EnableAutoConfiguration
●  Configuration automatique de l'application
●  Repose principalement sur les @Conditional
#backdaybyxebia
@ConditionalOnClass
@Configuration
@ConditionalOnClass(Mongo.class)
@EnableConfigurationProperties(MongoProperties.class)
public class MongoAutoConfiguration {
/* ... */
}
#backdaybyxebia
@ConditionalOnBean
@Configuration
@ConditionalOnExpression("${health.db.enabled:true}")
@ConditionalOnBean(DataSource.class)
public static class DataSourcesHealthIndicatorConfiguration {
/* ... */
}
#backdaybyxebia
@ConditionalOnMissingBean
@Bean
@ConditionalOnMissingBean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(
ObjectMapper objectMapper) {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(objectMapper);
converter.setPrettyPrint(this.properties.isJsonPrettyPrint());
return converter;
}
#backdaybyxebia
@ConditionalOnExpression
@ConditionalOnExpression("${security.basic.enabled:true}")
@Configuration
@Order(SecurityProperties.BASIC_AUTH_ORDER)
protected static class ApplicationWebSecurityConfigurerAdapter extends
WebSecurityConfigurerAdapter {
/*...*/
}
#backdaybyxebia
@ConditionalOnProperty
@Bean
@ConditionalOnProperty(prefix = "spring.mvc.", value = "date-format")
public Formatter<Date> dateFormatter() {
return new DateFormatter(this.mvcProperties.getDateFormat());
}
#backdaybyxebia
●  @ConditionalOnMissingClass
●  @ConditionalOnNotWebApplication
●  @ConditionalOnResource
●  @ConditionalOnWebApplication
#backdaybyxebia
Application.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;
@Configuration
@EnableAutoConfiguration
@Import(RepositoryRestMvcConfiguration.class)
@EnableJpaRepositories
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
#backdaybyxebia
Client.java
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Client {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id;
String name;
//Getter & Setter
}
#backdaybyxebia
ClientRepository.java
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
@RepositoryRestResource(collectionResourceRel = "client",path = "client")
public interface ClientRepository extends PagingAndSortingRepository<Client,Long> {
}
#backdaybyxebia
Sous le capot...
●  spring mvc
●  jpa + hibernate
●  logback
●  tomcat
●  spring HATEOAS
#backdaybyxebia
STARTERS
#backdaybyxebia
spring-boot-starter-parent
●  Gère la version des starters et des dépendances sous-jacentes
●  On ne définit que la version de spring boot (ex : 1.2.3.RELEASE)
#backdaybyxebia
spring-boot-starter-web
Tomcat + Spring MVC + logback
#backdaybyxebia
spring-boot-starter-jpa
JPA & Hibernate + Validation + TomcatConnectionPool
#backdaybyxebia
spring-boot-starter-security
●  basic auth
●  jdbc
●  oAuth
●  cas
●  ...
Spring security
#backdaybyxebia
spring-boot-starter-actuator
●  Metrics
●  Health Check
●  Autoconfig
●  Environment information
●  Pages d'erreurs par défaut
MVC endpoints + JMX support
#backdaybyxebia
spring-boot-starter-test
spring-boot-starter-jetty
spring-boot-starter-mongo
...
Liste complète sur https://github.com/spring-projects/spring-boot/tree/master/
spring-boot-starters
#backdaybyxebia
Gestion de configuration
#backdaybyxebia
Fichiers par défaut
●  application.properties
●  application.yml
#backdaybyxebia
Emplacements par défaut
●  classpath:
●  classpath:/config
●  file:
●  file:config/
#backdaybyxebia
Surcharger la configuration
#backdaybyxebia
ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "my-app")
public class SampleProperties {
private String version;
private String motd = "Some default value";
// Getters & setters
}
#backdaybyxebia
ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "my-app")
public class SampleProperties {
private String version;
private String motd = "Some default value";
// Getters & setters
}
SampleProperties.java
application.yml
my-app :
version : 1.2.3
motd : "Un message tellement plus utile"
#backdaybyxebia
ConfigurationProperties
@Service
public class SampleService {
@Inject
ClientProperties properties;
}
SampleService.java
#backdaybyxebia
Avec les profiles spring
$java -jar my-app.jar --spring.profiles.active=instance1
SampleProperties.java
application-instance1.yml
#
# Override properties from application.yml for instance1
#
server :
port : 8081
#backdaybyxebia
En précisant les fichiers
$java -jar my-app.jar --spring.config.location=
file:/etc/my-app/default.properties,
file:/etc/my-app/instance1.properties
#backdaybyxebia
Spring Cloud
#backdaybyxebia
Gestion de systèmes
distribués
●  Gestion de la configuration versionnée
●  Découverte et enregistrement de services
●  Messages distribués
●  Locks distribués
●  Election de leader dans un cluster
●  ...
Liste complète sur http://projects.spring.io/spring-cloud
#backdaybyxebia
spring-boot-netflix
●  service discovery
●  circuit breaker
●  load balancer côté client
●  monitoring
●  router et filter
●  ...
Liste complète sur http://projects.spring.io/spring-cloud
#backdaybyxebia
Démo
Gestion des actions
#backdaybyxebia
#backdaybyxebia
#backdaybyxebia
●  Tolérance à la panne
●  Monitoring en temps réel
●  Gestion de la concurrence
#backdaybyxebia
Eureka
Découverte de services
#backdaybyxebia
Let’s play
#backdaybyxebia
Critiques
#backdaybyxebia
●  Beaucoup de magies
●  Obligation de surcharger
●  Pratiquement plus de XML
●  Même courbe d’apprentissage que Spring
#backdaybyxebia
https://github.com/xebia-france/backday-
spring-boot-server

Backday Xebia : Découvrez Spring Boot sur un cas pratique