From the docs:
Classes that lack @Inject annotations cannot be constructed by Dagger.
Dagger actively requires you to add @Inject to your injectable class, either by adding a no-args constructor, or adding an injectable field. The third option is to return the class from an @Provides method like so:
@Module(...)
class MyModule {
@Provides Foo provideFoo() {
return new Foo(); // Foo is not injectable.
}
}
This does seem like extra boilerplate, but from experience with Guice and other frameworks, JIT binding of random classes turns out to be rife with error. We have seen java.lang.String injected into things, and because someone forgot to bind it, you ended up with "" injected instead of the desired string. Dagger, therefore, requires an @Inject constructor, or field.(Guice optionally has this in 4.x, though for backwards compatibility, it is off by default)
This is one rare instance where Dagger has chosen more correctness guarantees at the cost of some small amount of verbosity.