Dependency Injection

What is Dependency Injection?

Each Object-oriented application consists of many classes that work together in order to solve a problem. However, when writing a complex application, application classes should be as independent as possible. DI helps in gluing these classes together and at the same time keeping them independent. Dependency injection is a technique whereby one object (or static method) supplies the dependencies of another object.

Pros

  • increase the possibility to reuse classes
  • test them independently of other classes while unit testing

Code with no DI vs code with DI

public class Computer {

    private CPU cpu;
    
    public Computer() {
        this.cpu = new CPU();
    }
}
Dependency between Computer and CPU.
public class Computer {

    private CPU cpu;
    
    public Computer(CPU cpu) {
        this.cpu = cpu;
    }
    
}

Dependency between Computer and CPU. Dependency is injected through class constructor (Computer should not worry about CPU implementation).

Types of DI

  • Constructor-based dependency injection – used for mandatory dependencies
  • public Computer(CPU cpu) {
        this.cpu = cpu;
    }
    
  • Setter-based dependency injection – used for optional dependencies
  • public void setCPU(CPU cpu) {
        this.cpu = cpu;
    }
    
  • Property-based dependency injection – considered as bad practice!
  • @Autowired
    private CPU cpu;