Enjoying This Tutorial?
Subscribe to Ram N Java for high-quality, practical Java and Spring tutorials!
SUBSCRIBE NOWIntroduction
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.
Recommended Dependency Injection Tutorials from Ram N Java
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? |
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
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
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
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
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
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: