Enjoying This Tutorial?
Subscribe to Ram N Java for high-quality, practical Java and Spring tutorials!
SUBSCRIBE NOWIntroduction
In Spring Framework, configuring collection dependencies often involves collections that must maintain uniqueness, such as a java.util.Set. When your model requires a set containing custom dependent collaborator objects rather than basic literals, Spring provides the <set> element along with <ref bean="..."/> tags to seamlessly inject them via setter-based dependency injection.
Why Inject a Set of Dependent Objects?
- Ensuring Uniqueness: A
Setguarantees that duplicate collaborator references are automatically eliminated based on the object'sequals()andhashCode()contracts. - Declarative Collaborator Wiring: By leveraging nested
<ref bean="..."/>elements inside<set>, Spring connects independent bean instances without manual code instantiation. - Loose Coupling: Dependent beans can be configured and managed independently in XML, making testing and maintenance straightforward.
Step-by-Step Code Example
Here is an example showing how to inject a Set<Address> of dependent objects into a Customer bean using setter injection:
1. The Dependent and Consumer Classes
package com.ram.model;
import java.util.Objects;
import java.util.Set;
// 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 boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Address address = (Address) o;
return Objects.equals(city, address.city) && Objects.equals(state, address.state);
}
@Override
public int hashCode() {
return Objects.hash(city, state);
}
@Override
public String toString() {
return "Address [city=" + city + ", state=" + state + "]";
}
}
// Consumer Class holding the Set
public class Customer {
private String name;
private Set<Address> addresses;
public void setName(String name) {
this.name = name;
}
// Setter method for Set injection
public void setAddresses(Set<Address> addresses) {
this.addresses = addresses;
}
public void display() {
System.out.println("Customer Name: " + name);
System.out.println("Addresses:");
for (Address address : addresses) {
System.out.println(address);
}
}
}
2. Configuring applicationContext.xml
Define the dependent beans first, then reference them inside the <set> 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="Chennai" />
<property name="state" value="Tamil Nadu" />
</bean>
<!-- Customer Bean with Set Injection -->
<bean id="customer" class="com.ram.model.Customer">
<property name="name" value="Ram" />
<property name="addresses">
<set>
<ref bean="address1" />
<ref bean="address2" />
</set>
</property>
</bean>
3. Loading and Executing with ApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Customer customer = (Customer) context.getBean("customer");
customer.display();
Key Takeaway
Using <set> with nested <ref bean="..."/> elements enables Spring to populate distinct collaborator beans into a Java Set using setter injection, keeping component configurations flexible and strictly organized.
Recommended Collection & Dependency Injection Tutorials from Ram N Java
Click here to watch on Youtube:
https://www.youtube.com/watch?v=gij9cJoF_xs&list=UUhwKlOVR041tngjerWxVccw
Click the below Image to Enlarge:
| How to Inject Set having Dependent Object using Spring dependency injection by Setter method |
| How to Inject Set having Dependent Object using Spring dependency injection by Setter method |
| How to Inject Set having Dependent Object using Spring dependency injection by Setter method |
| How to Inject Set having Dependent Object using Spring dependency injection by Setter method |
No comments:
Post a Comment