![]() |
VOOZH | about |
You can transform standard Java classes into manageable objects by using dependency injection. Your programs can define dependencies on any managed object by using dependency injection. In addition to managing the life cycle of these instances for you, the container automatically supplies instances of these dependencies at the injection points during runtime. Dependency injection is a way of providing dependencies to an object from an external source such as an XML file. This makes our code more modular and easier to test.
Because it has several benefits that improve the design, testability, and maintainability of your code base, dependency injection is an essential approach in software development. Instead of constructing the dependent instance inside the class, we can inject dependencies into a class using the design pattern known as dependency injection.
By using this pattern, an object or function can use a particular service without having to understand how to create it. Dependency injection's key advantage is that it makes it possible for system objects to be loosely coupled. The goal of the design principle of loose coupling is to lessen the interdependence of system components. modifications to one object do not necessitate modifications to other objects when objects are loosely linked.
Dependencies can be injected into a class in several ways: through constructor injection, setter injection, or method injection.
public class GFGExample {
private final Dependency dependency;
public GFGExample(Dependency dependency) {
this.dependency = dependency;
}
public void doSomething() {
// Use the dependency here
}
}
Here is an Example of Constructor Injection:
The result is: 7
Setter injection is a dependency injection in which the spring framework injects the dependency object using the setter method. The call first goes to no argument constructor and then to the setter method. It does not create any new bean instance. Let’s see an example to inject dependency by the setter method.
public class MyClass {
private Dependency dependency;
public void setDependency(Dependency dependency) {this.dependency = dependency;
}
// code comes here.
}
Here is an example of Setter Injection:
In this instance, the Service class is dependent onto the Controller class. We inject the dependency from outside rather than explicitly constructing a Service class instance within the Controller class. We make a ServiceImpl class instance, which implements the Service interface. We then use the setService function to inject this instance into the Controller class.
We can adjust the Service interface's implementation in this way without having to alter the Controller class. As a result, the code is easier to maintain and more adaptable.
Using the method arguments rather than the constructor parameters, method injection provides a class's dependencies.
In some situations where constructor injection might not be the ideal choice, this technique can be helpful. Constructor injection is generally advised, though, as it encourages improved code organization and immutability.
public class Controller {
public void doSomething() {
Service service = getService();
service.process();
}
// This method is where the Service dependency is injected
protected Service getService() {return new ServiceImpl();
}
}
An example of method injection:
The ideal technique to introduce dependency depends on the particular circumstances. However, constructor injection is typically regarded as the most effective method of injecting dependencies. This is so because it is straightforward, explicit, and simple to test. The dependencies are passed to the constructor of the object during constructor injection. As a result, the object will always be initialised with all of its dependents, and it will be clear which dependencies the object requires.
Here are some advantages of dependency injection: