I think the rationale would be that larger apps have a larger number of dependencies that will be injected throughout. A service locator, or a runtime DI library, would necessarily need to know about each and every dependency available throughout the lifetime of the app in some ever-growing singleton object. In contrast, Dagger generates code and doesn’t really “hold on” to anything; it simply executes generated code whenever injection is requested, but it doesn’t need to hold in memory some kind of “binding object” in order to be able to inject stuff