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.