Spring Dependency Injection (DI)
In Spring frameowork, Dependency Injection (DI) design pattern is used to define the object dependencies between each other. It exits in two major types :
- Setter Injection
- Constructor Injection
1. Setter Injection
This is the most popular and simple DI method, it will injects the dependency via a setter method.
Example
A helper class with a setter method.
package com.mkyong.output;
import com.mkyong.output.IOutputGenerator;
public class OutputHelper
{
IOutputGenerator outputGenerator;
public void setOutputGenerator(IOutputGenerator outputGenerator){
this.outputGenerator = outputGenerator;
}
}
A bean configuration file to declare the beans and set the dependency via setter injection (property tag).
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="OutputHelper" class="com.mkyong.output.OutputHelper">
<property name="outputGenerator">
<ref bean="CsvOutputGenerator" />
</property>
</bean>
<bean id="CsvOutputGenerator" class="com.mkyong.output.impl.CsvOutputGenerator" />
<bean id="JsonOutputGenerator" class="com.mkyong.output.impl.JsonOutputGenerator" />
</beans>
You just injects a ‘CsvOutputGenerator’ bean into ‘OutputHelper’ object via a setter method (setOutputGenerator).
2. Constructor Injection
This DI method will injects the dependency via a constructor.
Example
A helper class with a constructor.
package com.mkyong.output;
import com.mkyong.output.IOutputGenerator;
public class OutputHelper
{
IOutputGenerator outputGenerator;
OutputHelper(IOutputGenerator outputGenerator){
this.outputGenerator = outputGenerator;
}
}
A bean configuration file to declare the beans and set the dependency via constructor injection (constructor-arg tag).
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="OutputHelper" class="com.mkyong.output.OutputHelper">
<constructor-arg>
<bean class="com.mkyong.output.impl.CsvOutputGenerator" />
</constructor-arg>
</bean>
<bean id="CsvOutputGenerator" class="com.mkyong.output.impl.CsvOutputGenerator" />
<bean id="JsonOutputGenerator" class="com.mkyong.output.impl.JsonOutputGenerator" />
</beans>
You just injects a ‘CsvOutputGenerator’ bean into ‘OutputHelper’ object via a constructor.
Setter or Constructor injection?
There are no hard rule set by Spring framework, just use whatever type of DI that suit your project needs. However, due to the simplicity of the setter injection, it’s always selected for most of the scenarios.
Though this post is a great way to learn about setter and constructor dependency injection but doesn’t put much light on What is dependency injection in Spring?
To know more about what is dependency injection please read this post – http://netjs.blogspot.com/2015/09/what-is-dependency-injection-in-spring.html
Nice post
Hi,
Your tutorials are very useful. It helps me to understand the concepts in short time.
I have a doubt regarding the DI. What about @Resource, @Autowire, @Qualifier, @Configurable annotations? Do they define new ways of Dependency Injection?
mkyong reference please add this my github for your tutorials i started with spring now … https://github.com/shareefhiasat/mkyong
Hi,In OutputHelper.java file ,I write this code :
public class OutputHelper {
IOutputGenerator outputGenerator;
OutputHelper(IOutputGenerator outputGenerator)
{
this.outputGenerator = outputGenerator;
}
public void generateOutput(){
outputGenerator.generateOutput();
}
public void setOutputGenerator(IOutputGenerator outputGenerator){
this.outputGenerator = outputGenerator;
}
}
And in Spring-comon.xml ,I define bean as bellow :
It appears error :
“Multiple annotations found at this line:
– No constructor with 0 arguments defined in class
‘OutputHelper’ ”
Please help me explain this error .Thanks
see this link…….https://mkyong.com/spring/spring-di-via-constructor/ why did you defiend twice ? to the same class
good for short time
How do I create a list of beans then inject the list ??
i.e. something like this :-
So that in my code i can just instantiate a list of helpers.
(apologies if theres an easy way of doing this, Im a Spring newbie)
you can definetely inject dependency for lists. something like this.
i want to know ,if we are using dependency injection in that case how to pass form parameters value to application-context. xml… so it can inject the parameter values…
Thanks. its a nice post.
Its good you studied and putting here to help all of us.we appreciate the work….
Apress – Spring Recipes A Problem Solution Approach – book is good for spring
im new for spring.i want more basic things about strings.
hi …is it possible to add two numbers in spring please tell me….