tl;dr
You can add @Singleton
to class Foo {}
and when Foo is instantiated via implicit binding, it will be bound as @Singleton. eg:
@Module(complete = false, injects = { Foo.class })
class MyModule { }
@Singleton
class Foo {
@Inject
Foo(Bar bar, Baz baz) { }
}
Scope
The caveat here is that if it is implicitly bound, but not referred to, in a root graph, extension graphs (.plus() generated graphs) may inadvertently instantiate it, so you need to either declare it as an entry-point (injects=) (which you did in your example), or it needs to be consumed by something reachable by an entry-point.
If you're not using .plus() for scoping/lifetime management, then this last point is not that important. But @Singleton means one-per-graph, and graphs' implicit bindings are only realized on-demand. An upcoming feature to allow custom scope annotations to be used will catch these errors.