Showing posts with label Map Collection. Show all posts
Showing posts with label Map Collection. Show all posts

Thursday, 25 October 2018

Spring Expression Language – Accessing Map[key is String] | Spring Tutorial

Master Spring & Java Development!

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

🔔 Subscribe to Ram N Java

Overview: Accessing Map Elements in SpEL

The Spring Expression Language (SpEL) provides powerful collection-handling capabilities right inside your configuration. When dealing with key-value data structures, SpEL allows you to extract individual entries directly from a Map using bracket notation.

In this guide, you will learn how to access Map elements where the key is a String, enabling dynamic value resolution and injection into your Spring beans.

How Map Key Access Works

SpEL supports standard indexer syntax to query key-value pairs stored in a java.util.Map:

  • String Key Syntax: Use single quotes inside brackets to specify a String key: #{beanName.mapProperty['myKey']}.
  • Type Safety: Spring evaluates the expression during bean initialization and automatically coerces the retrieved value into the target field's type.
  • Clean Decoupling: Retrieve specific configuration entries or lookup values without writing manual lookup code in your business logic.

Implementation Steps

  1. Define the Source Map: Configure a bean containing a populated Map with String keys (e.g., country codes, configuration properties, or user metadata).
  2. Query with SpEL: Reference the desired key inside your property expression, such as #{telephoneMap['US']}.
  3. Inject Value: Let the Spring IoC container inject the resolved value directly into your dependent bean.

Recommended Next Videos from Ram N Java


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

Click the below Image to Enlarge:
Spring Expression Language – Accessing Map[key is String] | Spring Tutorial

Spring Expression Language – Accessing Map[key is String] | Spring Tutorial

Spring Expression Language – Accessing Map[key is String] | 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.5.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>

AddressInfo.java

package com.ram.model;

import java.util.LinkedHashMap;
import java.util.Map;

import org.springframework.stereotype.Component;

@Component("addressInfo")
public class AddressInfo
{

    private Map<String, String> addressMap;

    public AddressInfo()
    {
        addressMap = new LinkedHashMap<String, String>();
        addressMap.put("East", "B220-East Street-London");
        addressMap.put("West", "A220-West Street-London");
        addressMap.put("North", "C220-North Street-London");
    }

    public Map<String, String> getAddressMap()
    {
        return addressMap;
    }

    public void setAddressMap(Map<String, String> addressMap)
    {
        this.addressMap = addressMap;
    }

    @Override
    public String toString()
    {
        return "AddressInfo [addressMap=" + addressMap + "]";
    }

}

Employee.java

package com.ram.model;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("employee")
public class Employee
{
    @Value("10")
    private int id;

    @Value("Peter")
    private String name;

    @Value("#{addressInfo.addressMap['West']}")
    private String westAddress;

    @Value("#{addressInfo.addressMap['North']}")
    private String northAddress;

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getWestAddress()
    {
        return westAddress;
    }

    public void setWestAddress(String westAddress)
    {
        this.westAddress = westAddress;
    }

    public String getNorthAddress()
    {
        return northAddress;
    }

    public void setNorthAddress(String northAddress)
    {
        this.northAddress = northAddress;
    }

    @Override
    public String toString()
    {
        return "Employee [id=" + id + ", name=" + name + ", westAddress="
                + westAddress + ", northAddress=" + northAddress + "]";
    }

}

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.3.xsd">


    <context:component-scan base-package="com.ram" />

</beans>

App.java

package com.ram.core;

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

import com.ram.model.Employee;
import com.ram.model.AddressInfo;

public class App
{
    public static void main(String[] args)
    {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");

        System.out.println("---------------------------------------");

        AddressInfo addressInfo = (AddressInfo) context.getBean("addressInfo");
        System.out.println(addressInfo + "\n");

        Employee employee = (Employee) context.getBean("employee");
        System.out.println(employee);
    }

}

Output

Sep 18, 2018 9:44:54 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@45ff54e6: startup date [Tue Sep 18 09:44:54 IST 2018]; root of context hierarchy
Sep 18, 2018 9:44:54 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
---------------------------------------
AddressInfo [addressMap={East=B220-East Street-London, West=A220-West Street-London, North=C220-North Street-London}]

Employee [id=10, name=Peter, westAddress=A220-West Street-London, northAddress=C220-North Street-London]

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

Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_Spring%20EL_accessing_Map_Key_String

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/41b19a6ea5ff82d0f409d467c69dd68cdbbf4a93/Spring_2018/SpringDemo_Spring%20EL_accessing_Map_Key_String/?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
  • Spring Expression Language – Accessing Map[Annotation] | Spring Tutorial

    Master Spring & Java Development!

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

    🔔 Subscribe to Ram N Java

    Overview: Accessing Maps in SpEL Using Annotations

    The Spring Expression Language (SpEL) offers native support for querying Java collections, including Map data structures. When configuring your components with modern Spring annotations, you can extract values from a map directly into target fields without manual lookups or helper utility methods.

    In this guide, you will learn how to access map entries using indexer notation along with the @Value annotation in an annotation-driven Spring configuration.

    Understanding SpEL Map Syntax

    SpEL provides an intuitive bracket notation to access map values by key:

    • Bracket Key Notation: Query any key using brackets and quotes: @Value("#{beanName.mapProperty['targetKey']}").
    • Dot Notation: If the key is an alphanumeric string without special characters, SpEL also allows dot notation: @Value("#{beanName.mapProperty.targetKey}").
    • Dynamic Injection: The Spring container evaluates the expression during bean post-processing and injects the retrieved value automatically.

    Step-by-Step Configuration

    1. Create the Source Bean: Define a Spring bean containing an initialized Map<String, String> or Map<String, Object>.
    2. Apply @Value: In your consumer component, annotate a property using the SpEL map reference: @Value("#{telephoneBean.telephoneMap['US']}").
    3. Initialize Application Context: Run your Spring context to observe the automatic extraction and injection of the map's corresponding value.

    Recommended Next Videos from Ram N Java


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

    Click the below Image to Enlarge:


    Spring Expression Language – Accessing Map[Annotation] | Spring Tutorial

    Spring Expression Language – Accessing Map[Annotation] | Spring Tutorial

    Spring Expression Language – Accessing Map[Annotation] | 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.5.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>

    AddressInfo.java

    package com.ram.model;

    import java.util.LinkedHashMap;
    import java.util.Map;

    import org.springframework.stereotype.Component;

    @Component("addressInfo")
    public class AddressInfo
    {

        private Map<Integer, String> addressMap;

        public AddressInfo()
        {
            addressMap = new LinkedHashMap<Integer, String>();
            addressMap.put(1, "B220-East Street-London");
            addressMap.put(2, "A220-West Street-London");
            addressMap.put(3, "C220-North Street-London");
        }

        public Map<Integer, String> getAddressMap()
        {
            return addressMap;
        }

        public void setAddressMap(Map<Integer, String> addressMap)
        {
            this.addressMap = addressMap;
        }

        @Override
        public String toString()
        {
            return "AddressInfo [addressMap=" + addressMap + "]";
        }

    }

    Employee.java

    package com.ram.model;

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;

    @Component("employee")
    public class Employee
    {
        @Value("10")
        private int id;

        @Value("Peter")
        private String name;

        @Value("#{addressInfo.addressMap[1]}")
        private String firstAddress;

        @Value("#{addressInfo.addressMap[2]}")
        private String secondAddress;

        public int getId()
        {
            return id;
        }

        public void setId(int id)
        {
            this.id = id;
        }

        public String getName()
        {
            return name;
        }

        public void setName(String name)
        {
            this.name = name;
        }

        public String getFirstAddress()
        {
            return firstAddress;
        }

        public void setFirstAddress(String firstAddress)
        {
            this.firstAddress = firstAddress;
        }

        public String getSecondAddress()
        {
            return secondAddress;
        }

        public void setSecondAddress(String secondAddress)
        {
            this.secondAddress = secondAddress;
        }

        @Override
        public String toString()
        {
            return "Employee [id=" + id + ", name=" + name + ", firstAddress="
                    + firstAddress + ", secondAddress=" + secondAddress + "]";
        }

    }

    applicationContext.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd">


        <context:component-scan base-package="com.ram" />

    </beans>

    App.java

    package com.ram.core;

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

    import com.ram.model.Employee;
    import com.ram.model.AddressInfo;

    public class App
    {
        public static void main(String[] args)
        {
            ApplicationContext context = new ClassPathXmlApplicationContext(
                    "applicationContext.xml");

            System.out.println("---------------------------------------");

            AddressInfo addressInfo = (AddressInfo) context.getBean("addressInfo");
            System.out.println(addressInfo + "\n");

            Employee employee = (Employee) context.getBean("employee");
            System.out.println(employee);
        }

    }

    Output

    Sep 17, 2018 9:42:51 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@736e9adb: startup date [Mon Sep 17 09:42:51 IST 2018]; root of context hierarchy
    Sep 17, 2018 9:42:51 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
    ---------------------------------------
    AddressInfo [addressMap={1=B220-East Street-London, 2=A220-West Street-London, 3=C220-North Street-London}]

    Employee [id=10, name=Peter, firstAddress=B220-East Street-London, secondAddress=A220-West Street-London]

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

    Github Link:
    https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_Spring%20EL_accessing_Map_Annotation

    Bitbucket Link:
    https://bitbucket.org/ramram43210/spring/src/f1b6bcc6f92fb27386d202f76d65a2386b8928b2/Spring_2018/SpringDemo_Spring%20EL_accessing_Map_Annotation/?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