DI w Angular jest hierarchiczne: injektory tworzą drzewo odzwierciedlające drzewo komponent/modułów. Gdy komponent zażąda zależności, Angular idzie w górę drzewa injektorów aż do znalezienia providera — który kontroluje, czy uzyskasz jedną wspólną instancję singleton czy osobną instancję na komponent.
Hierarchia injektora
Root injector (app-wide) ← providedIn: 'root' lives here (one singleton)
└─ Module/Route injectors
└─ Component injector ← providers: [...] in @Component
└─ Child component injector
Wyszukiwanie zaczyna się w żądającym komponencie i bąbelkuje do głównego. znaleziony provider wygrywa.
