You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring:如何通过applicationContext.xml注入properties文件中的Map至Model

解决方案

方法1:使用Spring表达式语言(SpEL)直接解析字符串为Map

修改applicationContext.xml中map属性的注入方式,通过SpEL让Spring自动将properties中的字符串解析为Map对象:

<bean id="model" class="Model">
    <property name="s1" value="${property1}" />
    <property name="s2" value="${property2}" />
    <property name="map" value="#{${list}}" />
</bean>

原理:${list}会先从properties文件中取出字符串{a:'A', b:'B', c:'C'},外层的#{...}会将该字符串作为SpEL表达式执行,而SpEL支持{key:'value'}这种Map字面量语法,最终生成对应的Map对象注入到map字段。

方法2:拆分配置项并使用<props>标签注入

若不想依赖SpEL,可修改properties的配置格式,将Map键值对拆分为单独配置项:

property1=Hello_1
property2=Hello_2
map.a=A
map.b=B
map.c=C

然后在applicationContext.xml中用<props>标签逐个注入:

<bean id="model" class="Model">
    <property name="s1" value="${property1}" />
    <property name="s2" value="${property2}" />
    <property name="map">
        <props>
            <prop key="a">${map.a}</prop>
            <prop key="b">${map.b}</prop>
            <prop key="c">${map.c}</prop>
        </props>
    </property>
</bean>

这种方式更直观,适合Map键值对较多或需要精准控制每个键值的场景。

方法3:自定义类型转换器

如果要保留原properties格式且不用SpEL,可以自定义转换器实现字符串到Map的转换:

  1. 实现Converter接口:
import org.springframework.core.convert.converter.Converter;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringToMapConverter implements Converter<String, Map<String, String>> {
    private static final Pattern MAP_PATTERN = Pattern.compile("(\\w+):'(\\w+)'");

    @Override
    public Map<String, String> convert(String source) {
        Map<String, String> map = new HashMap<>();
        if (source == null || source.isEmpty()) {
            return map;
        }
        String content = source.replaceAll("^\\{|\\}$", "").trim();
        Matcher matcher = MAP_PATTERN.matcher(content);
        while (matcher.find()) {
            map.put(matcher.group(1), matcher.group(2));
        }
        return map;
    }
}
  1. 在applicationContext.xml中注册转换器并启用:
<!-- 注册自定义转换器 -->
<bean id="stringToMapConverter" class="StringToMapConverter" />

<!-- 配置ConversionService -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <ref bean="stringToMapConverter" />
        </set>
    </property>
</bean>

<!-- 启用自定义转换服务 -->
<context:annotation-config conversion-service="conversionService" />

<!-- 原Model Bean配置保持不变 -->
<bean id="model" class="Model">
    <property name="s1" value="${property1}" />
    <property name="s2" value="${property2}" />
    <property name="map" value="${list}" />
</bean>

配置完成后,Spring注入时会自动调用转换器将${list}的字符串转换为Map对象。

内容的提问来源于stack exchange,提问作者Ibrahim Jazzar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:05:19