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的转换:
- 实现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; } }
- 在
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
相关产品推荐
相关产品推荐

