Joined March 2026
8 Photos and videos
Monaco 2026 đŸđŸŽïž #F1 #MonacoGP
33
16
Injecter des variables d'environnement dans application.yml avec #SpringBoot. PlutĂŽt que de coder en dur les valeurs sensibles ou spĂ©cifiques Ă  l'environnement, Spring permet de les injecter au dĂ©marrage via la syntaxe ${VARIABLE}. Deux comportements selon le besoin : → ${VAR} : variable obligatoire. L'application Ă©choue au dĂ©marrage si elle n'est pas dĂ©finie. → ${VAR:defaut} : variable optionnelle avec valeur de repli. RĂšgle simple : → Secrets et valeurs critiques : sans valeur par dĂ©faut, Ă©chec immĂ©diat si manquante → Valeurs techniques avec un fallback raisonnable : avec valeur par dĂ©faut Bonne pratique : Le fichier application.yml versionnĂ© dĂ©crit la structure. Les valeurs sensibles viennent de l'environnement, jamais du code. #Java #Configuration
32
De la France à l'Egypte : hommage à l'écrivain Taha Hussein radiofrance.fr/franceculture
 via @franceculture
28
32
Les profils #Spring permettent d'adapter la configuration selon l'environnement, sans changer le code. Spring sĂ©lectionne automatiquement le fichier de configuration en fonction du profil actif. Structure recommandĂ©e : → application.yml : configuration commune Ă  tous les environnements → application-dev.yml : surcharges pour le dĂ©veloppement local → application-staging.yml : surcharges pour la prĂ©-production → application-prod.yml : surcharges pour la production #Spring fusionne automatiquement le fichier commun avec celui du profil actif. Les valeurs du profil actif Ă©crasent celles de la configuration commune. Pour activer un profil : utilisez la variable d'environnement : SPRING_PROFILES_ACTIVE=prod @Profile permet de charger un bean uniquement pour un profil :
33
En JPA, TOUTES les relations doivent ĂȘtre LAZY. ​Rappel des valeurs par dĂ©faut : ✅ @OneToMany / @ManyToMany : Lazy (bon comportement) ❌ @ManyToOne / @OneToOne : Eager (le piĂšge classique) ​Pourquoi forcer le LAZY partout ? Une relation EAGER est chargĂ©e Ă  chaque requĂȘte, mĂȘme lorsque vous n'en avez pas besoin. RĂ©sultat : requĂȘtes SQL superflues, surconsommation de mĂ©moire et apparition du fameux problĂšme N 1. La rĂšgle : @ManyToOne(fetch = FetchType.LAZY) @OneToOne(fetch = FetchType.LAZY) Chargez ensuite explicitement les donnĂ©es nĂ©cessaires via @EntityGraph ou JOIN FETCH. ​Principe d'architecture Ă  retenir : Le chargement d'une relation doit ĂȘtre une dĂ©cision explicite du code appelant, et non un comportement cachĂ© ou subi depuis l'entitĂ©.
56
Le problĂšme N 1 en JPA/Hibernate : Vous chargez N entitĂ©s, puis vous accĂ©dez Ă  une relation lazy (@OneToMany, @ManyToOne). Hibernate dĂ©clenche 1 requĂȘte pour la liste, puis 1 requĂȘte par entitĂ© pour charger la relation. 100 commandes avec leurs lignes → 101 requĂȘtes SQL au lieu d'1 seule. 3 façons de l'Ă©viter, de la plus utilisĂ©e Ă  la moins utilisĂ©e : → @EntityGraph sur la mĂ©thode du repository : DĂ©claratif, lisible, directement sur le Spring Data Repository. Solution par dĂ©faut aujourd'hui. @EntityGraph(attributePaths = "items") → JOIN FETCH en JPQL : RequĂȘte explicite qui charge la relation en un seul SELECT avec JOIN. Utile dans les requĂȘtes custom. SELECT o FROM Order o JOIN FETCH o.items → Projection JPA : Si vous n'avez pas besoin des entitĂ©s complĂštes, sĂ©lectionnez directement les champs utiles via un DTO ou une interface de projection. Plus performant, moins de mĂ©moire, mais demande plus de code. Comment le dĂ©tecter : → spring.jpa.show-sql=true en dĂ©veloppement pour voir les requĂȘtes gĂ©nĂ©rĂ©es → Hibernate Statistics pour compter les requĂȘtes par transaction RĂšgle simple : Si le nombre de requĂȘtes dĂ©pend de la taille du rĂ©sultat, c'est un problĂšme N 1. #Java #SpringBoot #Hibernate #Performance
45
En #Spring, prĂ©fĂ©rez l'injection par constructeur Ă  @​Autowired sur champ. ​@​Autowired sur champ → pratique mais problĂ©matique : pas de final, dĂ©pendances cachĂ©es (surtout au code appelant), classes difficiles Ă  tester sans Spring. La solution : injection par constructeur. → DĂ©pendances explicites et contractuelles → Champs immuables (final) → Testable sans dĂ©marrer Spring RecommandĂ©e officiellement par l'Ă©quipe #Spring depuis longtemps.
57
HĂąte de voir ce que Opus 4.7 apporte cĂŽtĂ© raisonnement et contexte. đŸ€–
157
PiĂšge courant avec @Transactional : Vous mettez l’annotation sur une mĂ©thode private → aucune erreur, aucun warning. Le code compile et s’exĂ©cute normalement. Pourtant, aucune transaction n’est créée. Spring utilise un proxy AOP pour gĂ©rer les transactions. Ce proxy ne peut pas accĂ©der aux mĂ©thodes private → l'annotation est simplement ignorĂ©e. À retenir : @Transactional ne fonctionne que sur les mĂ©thodes public. #SpringBoot #Java #Transactional
121
@​Transactional par dĂ©faut, ce n'est pas toujours suffisant. readOnly = true Indique Ă  Hibernate qu'aucune modification n'est attendue → pas de dirty checking inutile → optimise les requĂȘtes SELECT. rollbackFor = Exception.class Permet le rollback aussi sur les checked exceptions. Par dĂ©faut, Spring ne rollback que sur les RuntimeException. Deux attributs simples pour plus de fiabilitĂ© et de performance. #SpringBoot #Java #Transactional
142
Pour une entitĂ© #JPA, Ă©vitez @​Data de Lombok ! @​Data gĂ©nĂšre equals(), hashCode() et toString() sur tous les champs → risques de bugs avec les proxys Hibernate, relations lazy et collections. Utilisez plutĂŽt : @​Getter @​Setter (si nĂ©cessaire) @​NoArgsConstructor Et si besoin (entitĂ©s dĂ©tachĂ©es, Sets, Maps
), implĂ©mentez equals()/hashCode() manuellement sur l’ID mĂ©tier. Pour un modĂšle de persistance stable et maĂźtrisĂ©. #Java #SpringBoot #Hibernate #Lombok
144
Développeur Full Stack Senior Java & Angular. Sujets principaux : architecture microservices, performances et Clean Code. Je partage ici mes retours d'expérience techniques. #Java #Angular #Microservices #CleanCode
1
133