Wednesday, 27 June 2018

How to Inject List having Dependent Object using Spring dependency injection by Setter method?

Enjoying This Tutorial?

Subscribe to Ram N Java for high-quality, practical Java and Spring tutorials!

SUBSCRIBE NOW

Introduction

In Spring Framework applications, managing one-to-many relationships often requires injecting an ordered collection of custom collaborator objects, such as a java.util.List. The Spring IoC container simplifies this using the <list> element along with <ref bean="..."/> tags to inject a list of dependent beans via setter-based dependency injection.

Why Inject a List of Dependent Objects?

  • Preserves Order: A List maintains the insertion sequence of your dependent collaborator beans as specified in your configuration.
  • Declarative Dependency Wiring: By leveraging nested <ref bean="..."/> tags inside <list>, Spring connects independent bean definitions cleanly without hardcoded object creation.
  • Modularity and Loose Coupling: Collaborator beans can be declared, configured, and tested independently before being wired into the consuming class.

Step-by-Step Code Example

Here is an example showing how to inject a List<Address> of dependent objects into an Employee bean using setter injection:

1. The Dependent and Consumer Classes

package com.ram.model;

import java.util.List;

// Dependent Object
public class Address {
    private String city;
    private String state;

    public void setCity(String city) {
        this.city = city;
    }

    public void setState(String state) {
        this.state = state;
    }

    @Override
    public String toString() {
        return "Address [city=" + city + ", state=" + state + "]";
    }
}

// Consumer Class holding the List
public class Employee {
    private String name;
    private List<Address> addresses;

    public void setName(String name) {
        this.name = name;
    }

    // Setter method for List injection
    public void setAddresses(List<Address> addresses) {
        this.addresses = addresses;
    }

    public void display() {
        System.out.println("Employee Name: " + name);
        System.out.println("Addresses:");
        for (Address addr : addresses) {
            System.out.println(addr);
        }
    }
}

2. Configuring applicationContext.xml

Define the dependent beans first, then reference them inside the <list> element:

<!-- Dependent Address Beans -->
<bean id="address1" class="com.ram.model.Address">
    <property name="city" value="Bangalore" />
    <property name="state" value="Karnataka" />
</bean>

<bean id="address2" class="com.ram.model.Address">
    <property name="city" value="Hyderabad" />
    <property name="state" value="Telangana" />
</bean>

<!-- Employee Bean with List Setter Injection -->
<bean id="employee" class="com.ram.model.Employee">
    <property name="name" value="Ram" />
    <property name="addresses">
        <list>
            <ref bean="address1" />
            <ref bean="address2" />
        </list>
    </property>
</bean>

3. Loading and Executing with ApplicationContext

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

Employee emp = (Employee) context.getBean("employee");
emp.display();

Key Takeaway

Using <list> with nested <ref bean="..."/> elements allows Spring to construct and inject ordered collections of dependent collaborator objects via setter injection, keeping component architectures modular and straightforward to maintain.


Click here to watch on Youtube:
https://www.youtube.com/watch?v=T-sdh1TBQVY&list=UUhwKlOVR041tngjerWxVccw

Click the below Image to Enlarge:

How to Inject List having Dependent Object using Spring dependency injection by Setter method?

How to Inject List having Dependent Object using Spring dependency injection by Setter method?

How to Inject List having Dependent Object using Spring dependency injection by Setter method?

How to Inject List having Dependent Object using Spring dependency injection by Setter method?

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0%20http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ram.core</groupId>
    <artifactId>SpringDemo</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>SpringDemo</name>
    <url>http://maven.apache.org</url>

    <properties>
        <spring.version>5.0.2.RELEASE</spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <!-- Spring 5 dependencies -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>
</project>

Fruit.java

package com.ram.model;

public class Fruit
{
    private String name;
    private String color;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getColor()
    {
        return color;
    }

    public void setColor(String color)
    {
        this.color = color;
    }

    @Override
    public String toString()
    {
        return "Fruit [name=" + name + ", color=" + color + "]";
    }

}

FruitShop.java

package com.ram.core;

import java.util.List;

import com.ram.model.Fruit;

public class FruitShop
{
    private String shopName;
    private List<Fruit> listOfAvailableFruits;
   
    public String getShopName()
    {
        return shopName;
    }

    public void setShopName(String shopName)
    {
        this.shopName = shopName;
    }

    public List<Fruit> getListOfAvailableFruits()
    {
        return listOfAvailableFruits;
    }

    public void setListOfAvailableFruits(List<Fruit> listOfAvailableFruits)
    {
        this.listOfAvailableFruits = listOfAvailableFruits;
    }

    public void displayFruitShopInfo()
    {
        System.out.println("FruitShop [shopName=" + shopName
                + ", listOfAvailableFruits=" + listOfAvailableFruits + "]");
    }

}

applicationContext.xml

<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-4.3.xsd">


    <bean id="fruit1" class="com.ram.model.Fruit">
        <property name="name" value="Apple"></property>
        <property name="color" value="Red"></property>
    </bean>

    <bean id="fruit2" class="com.ram.model.Fruit">
        <property name="name" value="Grapes"></property>
        <property name="color" value="Violet"></property>
    </bean>

    <bean id="fruitShop" class="com.ram.core.FruitShop">
        <property name="shopName" value="Fruit Mart"></property>
        <property name="listOfAvailableFruits">
            <list>
                <ref bean="fruit1" />
                <ref bean="fruit2" />
            </list>
        </property>
    </bean>

</beans>

App.java

package com.ram.core;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App
{
    public static void main(String[] args)
    {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");

        System.out.println("---------------------------------------");

        FruitShop fruitShop = (FruitShop) context.getBean("fruitShop");
        System.out.println(
                "Got fruitShop object from the ApplicationContext(Spring Container)");
        fruitShop.displayFruitShopInfo();

    }

}

Output

May 13, 2018 10:45:28 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Sun May 13 10:45:28 IST 2018]; root of context hierarchy
May 13, 2018 10:45:28 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
---------------------------------------
Got fruitShop object from the ApplicationContext(Spring Container)
FruitShop [shopName=Fruit Mart, listOfAvailableFruits=[Fruit [name=Apple, color=Red], Fruit [name=Grapes, color=Violet]]]

Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_Setter_DI_List_dependentObject.zip?attredirects=0&d=1

Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_Setter_DI_List_dependentObject

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/e3083a26f8b5dc28ef01dcb434963fb880058c7b/Spring_2018/SpringDemo_Setter_DI_List_dependentObject/?at=master

See also:
  • All JavaEE Videos Playlist
  • All JavaEE Videos
  • All JAVA EE Links
  • Spring Tutorial
  • Servlets Tutorial
  • All Design Patterns Links
  • JDBC Tutorial
  • Java Collection Framework Tutorial
  • JAVA Tutorial
  • Kids Tutorial
  • Cooking Tutorial
  • No comments:

    Post a Comment

    Tutorials