Showing posts with label List Collection Injection. Show all posts
Showing posts with label List Collection Injection. Show all posts

Friday, 25 May 2018

How to Inject List Collection using Spring dependency injection by constructor? | Spring Tutorial

Enjoying this Java & Spring tutorial?

Subscribe to Ram N Java on YouTube

Introduction

In Spring Framework, constructor-based dependency injection allows you to create immutable, thread-safe beans that have all required properties supplied during instantiation. A common requirement in Java applications is injecting collections such as java.util.List.

In this guide, you will learn how to configure and inject a List collection into your Java class through its constructor using Spring XML bean definitions.

1. Create the Java Bean Class

First, create a bean class (for example, FruitShop) containing a List<String> property and define a constructor that initializes it:

import java.util.List;

public class FruitShop {
    private String shopName;
    private List<String> fruitNames;

    public FruitShop(String shopName, List<String> fruitNames) {
        this.shopName = shopName;
        this.fruitNames = fruitNames;
    }

    public void displayFruitShopInfo() {
        System.out.println("Shop Name: " + shopName);
        System.out.println("Available Fruits:");
        for (String fruit : fruitNames) {
            System.out.println(" - " + fruit);
        }
    }
}
  

2. Configure Spring XML with <list>

In your Spring XML configuration file (applicationContext.xml), define the bean and pass the collection values inside <constructor-arg> using the <list> and <value> elements:

<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.xsd">

    <bean id="fruitShop" class="FruitShop">
        <constructor-arg value="Metro Fruit Center" />
        <constructor-arg>
            <list>
                <value>Apple</value>
                <value>Mango</value>
                <value>Orange</value>
                <value>Strawberry</value>
            </list>
        </constructor-arg>
    </bean>

</beans>
  

3. Run and Verify the Output

Load the Spring application context using ClassPathXmlApplicationContext and test the injected list:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        FruitShop shop = (FruitShop) context.getBean("fruitShop");
        shop.displayFruitShopInfo();
    }
}
  

Watch More Spring Tutorials


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

Click the below Image to Enlarge:
How to Inject List Collection using Spring dependency injection by constructor? | Spring Tutorial

How to Inject List Collection using Spring dependency injection by constructor? | Spring Tutorial

How to Inject List Collection using Spring dependency injection by constructor? | Spring Tutorial

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.List;

public class FruitShop
{
    private String shopName;
    private List<String> listOfAvailableFruits;

    public FruitShop(String shopName, List<String> listOfAvailableFruits)
    {
        System.out.println(
                "FruitShop(String shopName, List<String> listOfAvailableFruits) "
                        + "constructor is called by the Spring container");
        this.shopName = shopName;
        this.listOfAvailableFruits = listOfAvailableFruits;
    }

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

}

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="fruitShop" class="com.ram.core.FruitShop">

        <constructor-arg type="String" value="Fruit Mart"></constructor-arg>
        <constructor-arg type="java.util.List">
            <list>
                <value>apple</value>
                <value>pineapple</value>
                <value>orange</value>
            </list>
        </constructor-arg>

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

Apr 21, 2018 8:34:30 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Sat Apr 21 08:34:30 IST 2018]; root of context hierarchy
Apr 21, 2018 8:34:31 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
FruitShop(String shopName, List<String> listOfAvailableFruits) constructor is called by the Spring container
---------------------------------------
Got fruitShop object from the ApplicationContext(Spring Container)
FruitShop [shopName=Fruit Mart, listOfAvailableFruits=[apple, pineapple, orange]]

Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_DI_List_Collection.zip?attredirects=0&d=1

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

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/a1d5b66cf948298a0bb7c33e9b2c0967275f5a95/Spring_2018/SpringDemo_DI_List_Collection/?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
  • Tutorials