The concept of dependency injection is that it provides a way for objects to define their dependencies (with the other objects they work with) only through constructor arguments, arguments to a factory method, or properties which are set on the object instance when it is being constructed or returned from a factory method. So container actually injects those dependencies when it creates the bean.

Hence code gets much cleaner when the DI principle is applied, and a higher degree of decoupling is much easier when beans do not look up their dependencies.

There are two types of Dependency Injection:

1. Setter Injection
2. Constructor Injection