Builds a tree of injectors. This is a primary injector, plus child injectors needed for each {@code Binder.newPrivateBinder() private environment}. The primary injector is not necessarily a top-level injector.
Injector construction happens in two phases.
- Static building. In this phase, we interpret commands, create bindings, and inspect dependencies. During this phase, we hold a lock to ensure consistency with parent injectors. No user code is executed in this phase.
- Dynamic injection. In this phase, we call user code. We inject members that requested injection. This may require user's objects be created and their providers be called. And we create eager singletons. In this phase, user code may have started other threads. This phase is not executed for injectors created using {@link Stage#TOOL the tool stage}
@author crazybob@google.com (Bob Lee)
@author jessewilson@google.com (Jesse Wilson)