O DI do Angular é hierárquico: injetores formam uma árvore que espelha a árvore de componentes/módulos. Quando um componente solicita uma dependência, Angular caminha para cima pela árvore de injetores até encontrar um provider — que controla se você obtém um singleton compartilhado ou uma instância separada por componente.
A hierarquia do injetor
Root injector (app-wide) ← providedIn: 'root' lives here (one singleton)
└─ Module/Route injectors
└─ Component injector ← providers: [...] in @Component
└─ Child component injector
