Types of Dependency Injection in Spring

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:-
  1. Constructor based dependency injection
  2. 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. 
Verifying Setter Dependency Injection.

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 
Share on Google Plus

0 comments :

Post a Comment