Grapht is a dependency injector for Java. Unlike other DI containers that resolve dependencies lazily when instances are requested, Grapht can compute dependency graphs in advance. These graphs can be modified and analyzed prior to instantiation to achieve a variety of effects.
The design of Grapht is described in the following paper:
Michael D. Ekstrand and Michael Ludwig. 2016. Dependency Injection with Static Analysis and Context-Aware Policy. Journal of Object Technology 15, 1 (February 2016), pp. 1:1–31. DOI=10.5381/jot.2016.15.5.a1.
You can download the PDF directly.