In this tutorial we are going to discuss Dependency Injection (DI) in Spring.
Dependency Injection means injecting the dependency between two object as per as our requirement in our application, this help to reducing the dependency to each other and more beneficiary to unit testing of every objects independently.
Every java based application has a few objects that work together to present what the end-user sees as a working application. When writing a complex Java application, application classes should be as independent as possible of other Java classes to increase the possibility to reuse these classes and to test them independently of other classes while doing unit testing.
Consider an application has the Drawing class. In Drawing class there is a Shape class.
Shape may be Triangle or Circle or Rectangle etc.
public class Drawing{ private Shape shape; public Drawing(Shape shape) { this.shape = shape; } }
Here, we have removed the total control from Drawing and kept it somewhere else (ie. XML configuration file) and the dependency ( ie. class Shape) is being injected into the class Shape through a Class Constructor. Thus flow of control has been “inverted” by Dependency Injection (DI) because you have effectively delegated dependance’s to some external system.
public class Drawing{ private Shape shape; public void setShape(Shape shape) { this.shape = shape; } }
Second method of injecting dependency is through Setter Methods of Drawing class where we will create Shape instance and this instance will be used to call setter methods to initialize Drawing’s properties.
Scenario 1 You work in an organization where you and your colleagues tend to travel a lot. Generally you travel by air and every time you need to catch a flight, you arrange for a pickup by a cab. You are aware of the airline agency who does the flight bookings, and the cab agency which arranges for the cab to drop you off at the airport. You know the phone numbers of the agencies, you are aware of the typical conversational activities to conduct the necessary bookings.
Thus your typical travel planning routine might look like the following :
Now if your company suddenly changed the preferred agencies and their contact mechanisms, you would be subject to the following relearning scenarios
Its not just you, but probably many of your colleagues would need to adjust themselves to the new scenario. This could lead to a substantial amount of time getting spent in the readjustment process.
Scenario 2 Now lets say the protocol is a little bit different. You have an administration department. Whenever you needed to travel an administration department interactive telephony system simply calls you up (which in turn is hooked up to the agencies). Over the phone you simply state the destination, desired arrival date and time by responding to a programmed set of questions. The flight reservations are made for you, the cab gets scheduled for the appropriate time, and the tickets get delivered to you.
Now if the preferred agencies were changed, the administration department would become aware of a change, would perhaps readjust its workflow to be able to communicate with the agencies. The interactive telephony system could be reprogrammed to communicate with the agencies over the internet. However you and your colleagues would have no relearning required. You still continue to follow exactly the same protocol as earlier (since the administration department did all the necessary adaptation in a manner that you do not need to do anything differently).
Dependency Injection ? In both the scenarios, you are the client and you are dependent upon the services provided by the agencies. However Scenario 2 has a few differences.
Thats dependency injection in “real life”. This may not seem like a lot since you imagine a cost to yourself as a single person – but if you imagine a large organization the savings are likely to be substantial.
Strategy Design Patterns We can easily create a strategy design pattern using lambda. To implement…
Decorator Pattern A decorator pattern allows a user to add new functionality to an existing…
Delegating pattern In software engineering, the delegation pattern is an object-oriented design pattern that allows…
Technology has emerged a lot in the last decade, and now we have artificial intelligence;…
Managing a database is becoming increasingly complex now due to the vast amount of data…
Overview In this article, we will explore Spring Scheduler how we could use it by…