In Spring framework, Dependency Injection (DI)
design pattern is used to define the object dependencies between each
other. There are two type of Dependency Injection:-
- Constructor
based dependency injection
- Setter
based dependency injection
1. Constructor based
dependency injection:-
This dependency injection method injects the
dependency via a constructor. Constructor based dependency injection is
accomplished when the container invokes a class constructor with a number of
arguments, each representing a dependency on other class.
The following example shows a class that can only
be dependency-injected with constructor injection.
Bean class which is dependent on ConstructorDIHelper class. So here it
will be injected by constructor injection.
package
edu.constant.code.constructor.di;
public class ConstructorDI {
ConstructorDIHelper
helper;
public ConstructorDI(ConstructorDIHelper helper) {
this.helper = helper;
System.out.println("Inside Constructor");
}
public void verify() {
this.helper.verify();
}
}
Dependency object, ConstructorDIHelper, which will be injected to above bean:-
package
edu.constant.code.constructor.di;
public class ConstructorDIHelper {
public void verify() {
System.out.println("Verifyng Constructor
Dependency Injection.");
}
}
applicationcontext.xml file:-
<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="ConstructorDI" class="edu.constant.code.constructor.di.ConstructorDI">
<constructor-arg>
<bean class="edu.constant.code.constructor.di.ConstructorDIHelper"
/>
</constructor-arg>
</bean>
<bean id="ConstructorDIHelper" class="edu.constant.code.constructor.di.ConstructorDIHelper"
/>
<bean id="setterDI" class="edu.constant.code.setter.di.SetterDI">
<property name="setterDI">
<ref bean="SetterDIHelper" />
</property>
</bean>
<bean id="SetterDIHelper" class="edu.constant.code.setter.di.SetterDIHelper"
/>
</beans>
Verify construction dependency injection by below
program:-
package
edu.constant.code.constructor.di.verify;
import
org.springframework.beans.factory.BeanFactory;
import
org.springframework.beans.factory.xml.XmlBeanFactory;
import
org.springframework.core.io.ClassPathResource;
import
org.springframework.core.io.Resource;
import
edu.constant.code.constructor.di.ConstructorDI;
@SuppressWarnings("deprecation")
public class
VerifyConstructorDI {
public static void main(String[]
args) {
Resource r = new
ClassPathResource("applicationContext.xml");
BeanFactory
factory = new
XmlBeanFactory(r);
ConstructorDI
cdi = (ConstructorDI) factory.getBean("ConstructorDI");
cdi.verify();
}
}
Output will be:-
Feb 06, 2016 10:20:19 PM
org.springframework.beans.factory.xml.XmlBeanDefinitionReader
loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource
[applicationContext.xml]
Inside Constructor
Verifying Constructor Dependency Injection.
2. Constructor based
dependency injection:-
This is the most popular and simple DI method,
it will injects the dependency via a setter method. The following example shows a class that can only be dependency-injected using pure setter injection.
Bean class
which is dependent on SetterDIHelper class.
So here it will be injected by setter injection.
package
edu.constant.code.setter.di;
public class SetterDI {
SetterDIHelper
setterHelper;
public void setSetterDI(SetterDIHelper setterHelper) {
this.setterHelper = setterHelper;
System.out.println("Inside Setter method.");
}
public void verify() {
this.setterHelper.verify();
}
}
Dependency object, SetterDIHelper, which will be injected to above bean:-
package
edu.constant.code.setter.di;
public class SetterDIHelper {
public void verify() {
System.out.println("Verifying Setter Dependency
Injection.");
}
}
applicationcontext.xml file:-
<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="ConstructorDI" class="edu.constant.code.constructor.di.ConstructorDI">
<constructor-arg>
<bean class="edu.constant.code.constructor.di.ConstructorDIHelper"
/>
</constructor-arg>
</bean>
<bean id="ConstructorDIHelper" class="edu.constant.code.constructor.di.ConstructorDIHelper"
/>
<bean id="setterDI" class="edu.constant.code.setter.di.SetterDI">
<property name="setterDI">
<ref bean="SetterDIHelper" />
</property>
</bean>
<bean id="SetterDIHelper" class="edu.constant.code.setter.di.SetterDIHelper"
/>
</beans>
Verify setter dependency injection by below program:-
package
edu.constant.code.setter.di.verify;
import org.springframework.beans.factory.BeanFactory;
import
org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import edu.constant.code.setter.di.SetterDI;
@SuppressWarnings("deprecation")
public class VerifySetterDI {
public
static void main(String[] args) {
Resource r = new ClassPathResource("applicationContext.xml");
BeanFactory
factory = new XmlBeanFactory(r);
SetterDI cdi =
(SetterDI) factory.getBean("setterDI");
cdi.verify();
}
}
Output
will be :-
Feb 06, 2016 10:48:11 PM
org.springframework.beans.factory.xml.XmlBeanDefinitionReader
loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource
[applicationContext.xml]
Inside Setter method.
Constructor or Setter 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.
Download Example from below github repository:-
Github - Dependency Injection
0 comments :
Post a Comment