Aller au contenu

Spring — Scope des beans (Dependency Injection)

Dans le contexte de la DI (ex: Spring), le scope d’un bean définit son cycle de vie et son nombre d’instances.


1. Idée simple

Le scope répond à la question :

➡️ combien d’instances du bean sont créées ?


2. Singleton (par défaut)

@Component
@Scope("singleton")
class MyService {}

une seule instance dans toute l’application


Caractéristiques

  • partagé
  • performant
  • utilisé par défaut

3. Prototype

@Component
@Scope("prototype")
class MyService {}

une nouvelle instance à chaque injection


Caractéristiques

  • non partagé
  • plus flexible
  • plus coûteux

4. Request (web)

@Scope("request")

une instance par requête HTTP


5. Session (web)

@Scope("session")

une instance par session utilisateur


6. Application

@Scope("application")

une instance pour toute l’application web


7. Résumé des scopes

Scope Instances
singleton 1 pour toute l’app
prototype 1 à chaque injection
request 1 par requête HTTP
session 1 par session utilisateur
application 1 pour toute l’app web

8. Piège important

Singleton + état mutable :

@Component
class Counter {
    int count = 0; // ❌ partagé entre threads
}

problème :

  • race condition
  • bugs concurrents

9. Bonnes pratiques

  • utiliser singleton pour services stateless
  • éviter état mutable
  • utiliser prototype si besoin d’instance unique

Pièges fréquents

  • croire que prototype est géré comme singleton
  • oublier la concurrence sur singleton
  • utiliser session/request hors web

10. Questions classiques

Q1

scope par défaut ? singleton


Q2

prototype = ? nouvelle instance


Q3

danger du singleton ? concurrence


11. À retenir

  • scope = cycle de vie
  • singleton par défaut
  • attention aux données partagées

🧾 En résumé

  • singleton → partagé
  • prototype → nouveau à chaque fois
  • web scopes → dépend du contexte

Le choix du scope impacte directement la performance et la sécurité du code.


Voir aussi