gpt4 book ai didi

spring - 如何使用 Spring 框架从属性文件中获取值到 Map 中?

转载 作者:行者123 更新时间:2023-12-04 07:45:15 26 4
gpt4 key购买 nike

现在我可以从属性文件中注入(inject)值:

@Value("${aaa.prop}")
public String someProp;

但我想要更多的东西......

例如我有一些属性文件:
aaa.props=p1,p2,p3
aaa.props.p1=qwe
aaa.props.p2=asd
aaa.props.p3=zxc

我确定它包含属性 aaa.props , 对其他属性一无所知。我想使用这样的代码来映​​射这些属性:
@Value ("${aaa.props}") 
public Map<String, String> someProps;

生成的一些 Prop : {p1=qwe,p2=asd,p3=zxc}

最佳答案

好吧,我为您构建了一个通用方法:一个工厂 bean,它通过过滤另一个映射来创建一个映射(属性毕竟是一种映射)。

这是工厂bean:

public class FilteredMapFactoryBean<V> extends
AbstractFactoryBean<Map<String, V>>{

private Map<String, V> input;

/**
* Set the input map.
*/
public void setInput(final Map<String, V> input){
this.input = input;
}

/**
* Set the string by which key prefixes will be filtered.
*/
public void setKeyFilterPrefix(final String keyFilterPrefix){
this.entryFilter = new EntryFilter<String, V>(){

@Override
public boolean accept(final Entry<String, V> entry){
return entry.getKey().startsWith(keyFilterPrefix);
}
};
}

public static interface EntryFilter<EK, EV> {

boolean accept(Map.Entry<EK, EV> entry);
}

/**
* If a prefix is not enough, you can supply a custom filter.
*/
public void setEntryFilter(final EntryFilter<String, V> entryFilter){
this.entryFilter = entryFilter;
}

private EntryFilter<String, V> entryFilter;

/**
* {@inheritDoc}
*/
@Override
public Class<?> getObjectType(){
return Map.class;
}

/**
* {@inheritDoc}
*/
@Override
protected Map<String, V> createInstance() throws Exception{
final Map<String, V> map = new LinkedHashMap<String, V>();
for(final Entry<String, V> entry : this.input.entrySet()){
if(this.entryFilter == null || this.entryFilter.accept(entry)){
map.put(entry.getKey(), entry.getValue());
}
}
return map;
}

}

这是一个带有一些示例用法的spring bean定义文件:
<?xml version="1.0" encoding="UTF-8"?>
<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-3.0.xsd">

<!-- use System.getProperties() as input -->
<bean class="spring.test.FilteredMapFactoryBean" id="javaMap">
<property name="keyFilterPrefix" value="java." />
<property name="input" value="#{T(java.lang.System).getProperties()}" />
</bean>

<!-- use custom properties as input -->
<bean class="spring.test.FilteredMapFactoryBean" id="customMap">
<property name="keyFilterPrefix" value="hello" />
<property name="input">
<props>
<prop key="hello">Is it me you're looking for?</prop>
<prop key="hello.again">Just called to say: hello.</prop>
<prop key="hello.goodby">You say goodbye and I say hello</prop>
<prop key="goodbye.blue.sky">Did-did-did-did-you hear the falling bombs?</prop>
<prop key="goodbye.ruby.tuesday">Who could hang a name on you?</prop>
</props>
</property>
</bean>

</beans>

这是一个测试类:
public class Tester{

@SuppressWarnings("unchecked")
public static void main(final String[] args){
final ApplicationContext context =
new ClassPathXmlApplicationContext("classpath:spring/test/mapFactorybean.xml");

final Map<String, String> javaMap =
(Map<String, String>) context.getBean("javaMap");
print("java.", javaMap);
final Map<String, String> customMap =
(Map<String, String>) context.getBean("customMap");
print("hello.", customMap);

}

private static void print(final String prefix, final Map<String, String> map){
System.out.println("Map of items starting with " + prefix);
for(final Entry<String, String> entry : map.entrySet()){
System.out.println("\t" + entry.getKey() + ":" + entry.getValue());
}
System.out.println("");
}

}

输出如预期:
Map of items starting with java.
java.runtime.name:Java(TM) SE Runtime Environment
java.vm.version:14.2-b01
java.vm.vendor:Sun Microsystems Inc.
java.vendor.url:http://java.sun.com/
java.vm.name:Java HotSpot(TM) Client VM
java.vm.specification.name:Java Virtual Machine Specification
java.runtime.version:1.6.0_16-b01
java.awt.graphicsenv:sun.awt.Win32GraphicsEnvironment
[... etc]

Map of items starting with hello.
hello.goodby:You say goodbye and I say hello
hello:Is it me you're looking for?
hello.again:Just called to say: hello.

关于spring - 如何使用 Spring 框架从属性文件中获取值到 Map 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3608564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com