Master Spring & Java Development!
Subscribe to Ram N Java for clean, beginner-friendly coding guides!
🔔 Subscribe to Ram N JavaOverview: 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
-
Create the Source Bean: Define a Spring bean containing an initialized
Map<String, String>orMap<String, Object>. -
Apply @Value: In your consumer component, annotate a property using the SpEL map reference:
@Value("#{telephoneBean.telephoneMap['US']}"). - 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>
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 + "]";
}
}
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 + "]";
}
}
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>
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);
}
}
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]
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:
No comments:
Post a Comment