L'iniezione delle dipendenze di Angular è gerarchica: gli injector formano un albero che rispecchia l'albero dei componenti/moduli. Quando un componente richiede una dipendenza, Angular risale l'albero degli injector fino a trovare un provider — che controlla se ottieni un singleton condiviso o un'istanza separata per componente.
La gerarchia degli injector
Root injector (app-wide) ← providedIn: 'root' lives here (one singleton)
└─ Module/Route injectors
└─ Component injector ← providers: [...] in @Component
└─ Child component injector
Una ricerca inizia dal componente richiedente e risale fino alla radice. Il provider trovato vince.
