In general you have the following three options for injection directly into fields/attributes via explicit setter methods via explicit constructor parameters Field injection This type of injection instruments some kind of reflection mechanism for injecting the required dependencies into the class. While this injection type has the benefit, that it removes clutter code like setter methods or constructor parameters, it has the drawback that these dependencies are invisible. If you look at the class from the outside, you will only see the public methods and may be the constructor. Even if this gives you a very clear idea what services a class provides, it has, in my opinion, this major drawback: When writing tests for this particular class you have to inspect the class to see what are the required dependencies and must use either invoke the DI framework, even for simple tests, or use a kind of reflection mechanism to inject...