I see this more as an inconvenience than an architectural flaw, though. I do like that with Guice, whenever I need a new dependency, I simply declare it in the constructor and I’m done
class MyClass(val logger: Logger) // <— logger is automatically injected