Questions d'entretien Spring Boot
1. Comment fonctionne l'auto-configuration de Spring Boot ?
L'auto-configuration detecte les dependances sur le classpath et configure automatiquement les beans correspondants. Le mecanisme : Spring Boot scanne les fichiers META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports dans chaque JAR. Chaque classe d'auto-configuration utilise des conditions : @ConditionalOnClass (classe presente sur le classpath), @ConditionalOnMissingBean (bean pas encore defini), @ConditionalOnProperty (propriete activee). Vous pouvez voir les conditions evaluees avec --debug ou l'endpoint /actuator/conditions.
2. Expliquez les Spring Boot Starters et leur fonctionnement.
Un starter est un ensemble de dependances Maven/Gradle qui simplifie la configuration. Exemple : spring-boot-starter-web inclut Spring MVC, un serveur Tomcat embarque, Jackson pour le JSON, et les auto-configurations correspondantes. Starters courants : starter-data-jpa (JPA + Hibernate), starter-security (Spring Security), starter-test (JUnit, Mockito, Spring Test), starter-actuator (monitoring). Chaque starter tire les dependances necessaires et active les auto-configurations via les conditions @ConditionalOn*.
3. Comment gerer les proprietes de configuration dans Spring Boot ?
Sources (ordre de priorite) : arguments de ligne de commande > variables d'environnement > application-{profile}.properties > application.properties > valeurs par defaut. Utilisez @ConfigurationProperties pour binder des proprietes a un POJO type-safe (meilleur que @Value pour les groupes de proprietes). Activez les profils (spring.profiles.active=prod) pour les configurations par environnement. Externalisez les secrets avec un coffre-fort (Vault, AWS Secrets Manager) ou des variables d'environnement.
4. Comment securiser une API Spring Boot avec Spring Security ?
Spring Security filtre les requetes HTTP via une chaine de SecurityFilterChain. Configuration moderne (Spring Security 6+) : SecurityFilterChain bean avec HttpSecurity. Authentification : formLogin, httpBasic, OAuth2 (Resource Server pour les JWT, Client pour le SSO). Autorisation : requestMatchers avec permit/authenticated/hasRole au niveau URL, @PreAuthorize au niveau methode. Desactivez CSRF pour les API stateless (JWT). Utilisez un PasswordEncoder (BCrypt) pour hasher les mots de passe.
5. Qu'est-ce que Spring Data JPA et comment l'utiliser efficacement ?
Spring Data JPA simplifie l'acces aux donnees avec des Repository interfaces. Definissez une interface extends JpaRepository et Spring genere l'implementation. Derived queries : findByNameAndAge(), existsByEmail() — Spring deduit la requete SQL du nom de la methode. @Query pour les requetes JPQL ou natives. Optimisations : EntityGraph pour eviter le N+1, projections pour ne lire que les champs necessaires, Pageable pour la pagination, Specifications pour les requetes dynamiques.
6. Comment gerer les transactions dans Spring ?
L'annotation @Transactional gere les transactions declarativement. Proprietes : propagation (REQUIRED par defaut — rejoint la transaction existante ou en cree une), isolation (niveau d'isolation SQL), readOnly (optimisation pour les lectures), timeout, rollbackFor (exceptions declenchant un rollback). Pieges courants : @Transactional ne fonctionne que sur les methodes publiques (proxy-based AOP), l'auto-invocation ne declenche pas le proxy, les exceptions checked ne provoquent pas de rollback par defaut.
7. Expliquez Spring Boot Actuator et ses endpoints.
Actuator expose des endpoints de monitoring et de gestion : /health (etat de l'application et de ses dependances), /metrics (metriques Micrometer : CPU, memoire, requetes HTTP), /info (informations sur l'application), /env (proprietes de configuration), /loggers (modifier les niveaux de log a chaud), /threaddump et /heapdump (diagnostic). Securisez ces endpoints (ne les exposez pas publiquement). Exportez les metriques vers Prometheus avec micrometer-registry-prometheus.
8. Comment implementer la gestion des erreurs dans une API REST Spring Boot ?
Utilisez @ControllerAdvice avec @ExceptionHandler pour centraliser la gestion des erreurs. Definissez un ErrorResponse standard (timestamp, status, message, path). Creez des exceptions metier specifiques (ResourceNotFoundException -> 404, ValidationException -> 400). Spring Boot fournit ProblemDetail (RFC 7807) pour un format d'erreur standardise. N'exposez jamais les stack traces en production (server.error.include-stacktrace=never).
9. Comment tester une application Spring Boot ?
@SpringBootTest : charge le contexte complet (tests d'integration). @WebMvcTest : teste les controllers sans charger tout le contexte. @DataJpaTest : teste les repositories avec une base H2 en memoire. MockMvc : simule des requetes HTTP sans demarrer le serveur. @MockBean : remplace un bean par un mock dans le contexte Spring. TestRestTemplate / WebTestClient : tests d'integration avec le serveur demarre. Testcontainers : bases de donnees reelles dans Docker pour les tests d'integration realistes.
10. Quelles sont les nouveautes de Spring Boot 3 et Spring Framework 6 ?
Changements majeurs : migration vers Java 17+ (minimum), passage de javax.* a jakarta.* (Jakarta EE 10), support natif de GraalVM Native Image (demarrage en millisecondes), Spring AOT (compilation ahead-of-time), support des Virtual Threads (Java 21), Observability integree avec Micrometer Tracing (remplacement de Spring Cloud Sleuth), ProblemDetail (RFC 7807) par defaut, et HTTP interfaces (clients HTTP declaratifs comme Spring Data).