El DI de Angular es jerárquico: los inyectores forman un árbol que refleja el árbol de componentes/módulos. Cuando un componente solicita una dependencia, Angular recorre hacia arriba el árbol de inyectores hasta encontrar un proveedor — que controla si obtienes una instancia singleton compartida o una instancia separada por componente.
La jerarquía del inyector
Root injector (app-wide) ← providedIn: 'root' lives here (one singleton)
└─ Module/Route injectors
└─ Component injector ← providers: [...] in @Component
└─ Child component injector
