Kann Spring @ Value verwendet werden, um Werte von der Eigenschaftendatei zur HashMap zuzuordnen?
Ja, ist es. Mit ein wenig Hilfe von Code und Spel.
Erstens betrachten diese Singleton Frühling-Bohne (Sie sollten es scannen):
@Component("PropertySplitter")
public class PropertySplitter {
/**
* Example: one.example.property = KEY1:VALUE1,KEY2:VALUE2
*/
public Map<String, String> map(String property) {
return this.map(property, ",");
}
/**
* Example: one.example.property = KEY1:VALUE1.1,VALUE1.2;KEY2:VALUE2.1,VALUE2.2
*/
public Map<String, List<String>> mapOfList(String property) {
Map<String, String> map = this.map(property, ";");
Map<String, List<String>> mapOfList = new HashMap<>();
for (Entry<String, String> entry : map.entrySet()) {
mapOfList.put(entry.getKey(), this.list(entry.getValue()));
}
return mapOfList;
}
/**
* Example: one.example.property = VALUE1,VALUE2,VALUE3,VALUE4
*/
public List<String> list(String property) {
return this.list(property, ",");
}
/**
* Example: one.example.property = VALUE1.1,VALUE1.2;VALUE2.1,VALUE2.2
*/
public List<List<String>> groupedList(String property) {
List<String> unGroupedList = this.list(property, ";");
List<List<String>> groupedList = new ArrayList<>();
for (String group : unGroupedList) {
groupedList.add(this.list(group));
}
return groupedList;
}
private List<String> list(String property, String splitter) {
return Splitter.on(splitter).omitEmptyStrings().trimResults().splitToList(property);
}
private Map<String, String> map(String property, String splitter) {
return Splitter.on(splitter).omitEmptyStrings().trimResults().withKeyValueSeparator(":").split(property);
}
}
Hinweis:PropertySplitter
Klasse verwendet Splitter
Dienstprogramm von Guava. Weitere Informationen finden Sie unter its documentation.
Dann in einiger Bohne von Ihnen:
@Component
public class MyBean {
@Value("#{PropertySplitter.map('${service.expiration}')}")
Map<String, String> propertyAsMap;
}
Und schließlich die Eigenschaft:
service.expiration = name1:100,name2:20
Es ist nicht genau das, was Sie gefragt haben, weil diese PropertySplitter
Arbeiten mit einer einzigen Eigenschaft, dass ist umgewandelt in eine Map
, aber ich denke, Sie könnten entweder auf diese Weise der Angabe von Eigenschaften wechseln, oder ändern Sie die PropertySplitter
-Code, so dass es die hierarchischere Weise entspricht Verlangen.
neue und Spring Bohnenfabrik sind orthogonal. new bedeutet "no Spring" – duffymo
@duffymo kann nicht so verallgemeinert werden. new Entity, das neue ValueObject fällt nicht darunter – madhairsilence