Showing posts with label Array Injection. Show all posts
Showing posts with label Array Injection. Show all posts

Sunday, 1 July 2018

How to Inject Array 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 applications, models often contain collections or arrays of custom objects (such as an array of Address or Department objects) rather than simple primitive types. The Spring IoC container provides straightforward XML collection configuration elements like <array> or <list> combined with <ref bean="..."/> to inject arrays of dependent collaborator objects via setter methods.

Why Inject Arrays of Dependent Objects?

  • Managing Multi-Valued Relationships: Allows entities to hold multiple collaborator instances (one-to-many style relationships) easily.
  • Reusability & Modularity: Dependent beans can be configured separately in XML and referenced across multiple bean arrays using <ref> tags.
  • Automatic Array Conversion: Spring automatically converts the XML list or array structure into a strongly typed Java array of the target class type.

Step-by-Step Code Example

Here is an example demonstrating an Employee bean that has an array of Address objects injected via setter dependency injection:

1. The Dependent and Consumer Model Classes

package com.ram.model;

// Dependent Class
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 city + ", " + state;
    }
}

// Consumer Class with Array of Dependent Objects
public class Employee {
    private Address[] addresses;

    // Setter method for injection
    public void setAddresses(Address[] addresses) {
        this.addresses = addresses;
    }

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

2. Configuring applicationContext.xml

Define the individual Address beans and reference them inside the <array> 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 injecting array of dependent objects -->
<bean id="employee" class="com.ram.model.Employee">
    <property name="addresses">
        <array>
            <ref bean="address1" />
            <ref bean="address2" />
        </array>
    </property>
</bean>

3. Loading and Executing the Application

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

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

Key Takeaway

Using <array> with nested <ref bean="..."/> elements enables Spring to inject complex, multi-object relationships cleanly through standard setter methods without hardcoding object instantiation inside Java classes.


Click here to watch on Youtube:
https://www.youtube.com/watch?v=7V_tlfRyzUM&list=UUhwKlOVR041tngjerWxVccw

Click the below Image to Enlarge:
How to Inject Array having Dependent Object using Spring dependency injection by Setter method?

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

How to Inject Array 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.Arrays;

import com.ram.model.Fruit;

public class FruitShop
{
    private String shopName;
    private Fruit[] fruitArray;

    public String getShopName()
    {
        return shopName;
    }

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

    public Fruit[] getFruitArray()
    {
        return fruitArray;
    }

    public void setFruitArray(Fruit[] fruitArray)
    {
        this.fruitArray = fruitArray;
    }

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

}

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="fruitArray">
            <array>
                <ref bean="fruit1" />
                <ref bean="fruit2" />
            </array>
        </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 20, 2018 7:57:43 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Sun May 20 07:57:42 IST 2018]; root of context hierarchy
May 20, 2018 7:57:43 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, fruitArray=[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_Array_dependentObjects.zip?attredirects=0&d=1

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

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/1d6c0798a42d1eaf790f76d197a6d8351f55fe21/Spring_2018/SpringDemo_Setter_DI_Array_dependentObjects/?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
  • How to Inject Array of String using Spring dependency injection by Setter method? | Spring Tutorial

    Enjoying This Tutorial?

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

    SUBSCRIBE NOW

    Introduction

    In Spring Framework applications, configuring collections and arrays is a fundamental requirement. Whether managing a list of role names, configuration paths, or categories, Spring makes it straightforward to inject an array of strings (String[]) into a bean using setter-based dependency injection.

    Why Use Setter Injection for String Arrays?

    • Built-in Conversion: Spring’s IoC container seamlessly parses XML <array> or <list> definitions and converts them into a Java String[] array.
    • Clean Property Configuration: Using the <value> sub-element inside <array> allows you to specify string values cleanly without custom parsing logic.
    • Flexibility: Setter-based injection allows collection properties to be optional or reconfigured easily during development and testing.

    Step-by-Step Code Example

    Here is an example demonstrating an Employee class receiving an array of programming skills via setter dependency injection:

    1. The Java Model Class

    package com.ram.model;
    
    import java.util.Arrays;
    
    public class Employee {
        private String name;
        private String[] skills;
    
        public void setName(String name) {
            this.name = name;
        }
    
        // Setter method for injecting String array
        public void setSkills(String[] skills) {
            this.skills = skills;
        }
    
        public void display() {
            System.out.println("Employee Name: " + name);
            System.out.println("Skills: " + Arrays.toString(skills));
        }
    }

    2. Configuring applicationContext.xml

    Use the <property> element along with the nested <array> and <value> tags:

    <bean id="employee" class="com.ram.model.Employee">
        <property name="name" value="Ram" />
        <property name="skills">
            <array>
                <value>Java</value>
                <value>Spring Framework</value>
                <value>Hibernate</value>
                <value>Microservices</value>
            </array>
        </property>
    </bean>

    3. Loading and Executing with ApplicationContext

    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    
    Employee emp = (Employee) context.getBean("employee");
    emp.display();

    Key Takeaway

    Spring simplifies injecting string arrays by using standard <array> elements inside property tags. This eliminates hardcoded values and keeps collection configurations neatly centralized in XML.

    Tutorials