Master Spring & Java Development!
Subscribe to Ram N Java for clean, beginner-friendly coding guides!
🔔 Subscribe to Ram N JavaOverview: Configuring Concrete Sets with SetFactoryBean
In the Spring Framework, working with Java collections is a routine part of configuring beans. By default, Spring provides standard Set collection handling via basic XML tags. However, when your architecture demands a specific concrete implementation—such as a HashSet, LinkedHashSet, or a naturally sorted TreeSet—Spring's SetFactoryBean gives you precise control over which concrete class is instantiated and populated inside the container.
In this guide, you will learn how to configure SetFactoryBean in XML, specify target set implementations like HashSet and TreeSet, and inject the resulting collection bean into your application components.
Understanding SetFactoryBean
SetFactoryBean is a Spring factory bean tailored for constructing concrete set collections:
-
Target Concrete Class: Use the
targetSetClassproperty to explicitly specify implementation types such asjava.util.HashSetorjava.util.TreeSet. -
Pre-Populated Elements: Accepts elements through its
sourceSetproperty and transfers them into the newly constructed concrete set instance. -
Natural Sorting via TreeSet: When configuring a
TreeSet, elements are automatically stored in their natural sorted order without requiring extra sorting logic. - Reusable Set Bean: Generates an independent bean definition that can be injected into multiple collaborator beans throughout your Spring application context.
Step-by-Step Implementation
-
Declare SetFactoryBean in XML: Define the bean using
org.springframework.beans.factory.config.SetFactoryBean. -
Specify Target Set Class: Set the concrete collection type via
targetSetClass:
<property name="targetSetClass" value="java.util.TreeSet"/> -
Populate Source Set Elements: Add values inside the
sourceSetproperty:
<property name="sourceSet">
<set>
<value>Java</value>
<value>Spring</value>
<value>Hibernate</value>
</set>
</property> -
Inject into Target Bean: Reference the constructed set bean inside your dependent bean's property declaration using
ref.
Recommended Next Videos from Ram N Java
Click here to watch on Youtube:
https://www.youtube.com/watch?v=F4nMpXg5OkA&list=UUhwKlOVR041tngjerWxVccw
Click the below Image to Enlarge:
| How to create a concrete Set Collection class (HashSet and TreeSet) using SetFactoryBean in Spring |
| How to create a concrete Set Collection class (HashSet and TreeSet) using SetFactoryBean in Spring |
pom.xml
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>
FruitShop.java
import java.util.Set;
public class FruitShop
{
private String shopName;
private Set<String> setOfAvailableFruits;
public String getShopName()
{
return shopName;
}
public void setShopName(String shopName)
{
System.out.println("setShopName(String shopName) is "
+ "called by the Spring Container");
this.shopName = shopName;
}
public Set<String> getSetOfAvailableFruits()
{
return setOfAvailableFruits;
}
public void setSetOfAvailableFruits(Set<String> setOfAvailableFruits)
{
System.out.println(
"setSetOfAvailableFruits(Set<String> setOfAvailableFruits) is "
+ "called by the Spring Container");
this.setOfAvailableFruits = setOfAvailableFruits;
}
public void displayFruitShopInfo()
{
System.out.println("FruitShop [shopName=" + shopName
+ ", setOfAvailableFruits=" + setOfAvailableFruits + "]");
}
}
applicationContext.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.3.xsd">
<bean id="fruitShop" class="com.ram.core.FruitShop">
<property name="shopName" value="Fruit Mart"></property>
<property name="setOfAvailableFruits">
<bean class="org.springframework.beans.factory.config.SetFactoryBean">
<property name="targetSetClass">
<value>java.util.HashSet</value>
</property>
<property name="sourceSet">
<list>
<value>apple</value>
<value>pineapple</value>
<value>orange</value>
</list>
</property>
</bean>
</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 [Sat Jul 28 18:14:24 IST 2018]; root of context hierarchy
Jul 28, 2018 6:14:24 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
setShopName(String shopName) is called by the Spring Container
setSetOfAvailableFruits(Set<String> setOfAvailableFruits) is called by the Spring Container
---------------------------------------
Got fruitShop object from the ApplicationContext(Spring Container)
FruitShop [shopName=Fruit Mart, setOfAvailableFruits=[orange, apple, pineapple]]
Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_Set_SetFactoryBean.zip?attredirects=0&d=1
Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_Set_SetFactoryBean
Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/463ef0439e374e3884b06b8ead881ecf3ac4364f/Spring_2018/SpringDemo_Set_SetFactoryBean/?at=master
See also:
No comments:
Post a Comment