Thursday, 9 August 2018

How to create a concrete Set Collection class (HashSet and TreeSet) using SetFactoryBean in Spring

Master Spring & Java Development!

Subscribe to Ram N Java for clean, beginner-friendly coding guides!

🔔 Subscribe to Ram N Java

Overview: 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 targetSetClass property to explicitly specify implementation types such as java.util.HashSet or java.util.TreeSet.
  • Pre-Populated Elements: Accepts elements through its sourceSet property 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

  1. Declare SetFactoryBean in XML: Define the bean using org.springframework.beans.factory.config.SetFactoryBean.
  2. Specify Target Set Class: Set the concrete collection type via targetSetClass:
    <property name="targetSetClass" value="java.util.TreeSet"/>
  3. Populate Source Set Elements: Add values inside the sourceSet property:
    <property name="sourceSet">
      <set>
        <value>Java</value>
        <value>Spring</value>
        <value>Hibernate</value>
      </set>
    </property>
  4. 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

<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>

FruitShop.java

package com.ram.core;

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

<beans xmlns="http://www.springframework.org/schema/beans"
    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

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

Jul 28, 2018 6:14:24 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
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:

  • 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