DI-ul Angular este ierarhic: injectorii formează un arbore care reflectă arborele component/modul. Când o componentă solicită o dependență, Angular merge în sus prin arborele injectorilor până când găsește un provider — care controlează dacă obțineți o instanță singleton partajată sau o instanță separată per componentă.
Ierarhia injectorului
Root injector (app-wide) ← providedIn: 'root' lives here (one singleton)
└─ Module/Route injectors
└─ Component injector ← providers: [...] in @Component
└─ Child component injector
