Now you know that the dependency injection configuration has two parts:
- Registering providers: How and where an object should be created.
- Injecting dependencies: What an object depends on.
And everything an object depends on (services, directives, and elements) is injected into its constructor. To make this work the framework builds a tree of injectors.
First, every DOM element with a component or a directive on it gets an injector. This injector contains the component instance, all the providers registered by the component, and a few "local" objects (for example, the element).
Second, when bootstrapping an NgModule, Angular creates an injector using the module and the providers defined there.
So the injector tree of the application will look like this: