Sure pass in your dependencies as an interface via some sort of constructor, but why all the frameworks to do so?
Why all the complexity with hard to debug magic strings, annotations and finding out what's missing from the classpath at runtime?
Just seems as a very complicated way to avoid creating package c that brings together package a and dependency b in a simple class that creates b and passes it into a.
What am I missing?