我有一个Map<String, String>,我想告诉Spring在创建bean和解析属性占位符时使用它.最简单的方法是什么?这是一个例子:
@Component
public class MyClass {
private String myValue;
@Autowired
public MyClass(@Value("${key.in.map}") String myValue) {
this.myValue = myValue;
}
public String getMyValue() {
return myValue;
}
}
public static void main(String[] args) {
Map<String, String> propertyMap = new HashMap<>();
propertyMap.put("key.in.map", "value.in.map");
ApplicationContext ctx = ...;
// Do something???
ctx.getBean(MyClass.class).getMyValue(); // Should return "value.in.map"
}
Run Code Online (Sandbox Code Playgroud)
Spring 提供了一个MapPropertySource,您可以使用您的 注册ApplicationContext(Environment您将需要ConfigurableEnvironment大多数ApplicationContext实现提供的一个)。
PropertySource解析器(按顺序)使用这些注册值来查找占位符名称的值。
这是一个完整的示例:
@Configuration
@ComponentScan
public class Example {
@Bean
public static PropertySourcesPlaceholderConfigurer configurer() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
// can also add it here
//configurer.setPropertySources(propertySources);
return configurer;
}
public static void main(String[] args) {
Map<String, Object> propertyMap = new HashMap<>();
propertyMap.put("key.in.map", "value.in.map");
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
MapPropertySource propertySource = new MapPropertySource("map-source", propertyMap);
ctx.getEnvironment().getPropertySources().addLast(propertySource);
ctx.register(Example.class);
ctx.refresh();
MyClass instance = ctx.getBean(MyClass.class);
System.out.println(instance.getMyValue());
}
}
@Component
class MyClass {
private String myValue;
@Autowired
public MyClass(@Value("${key.in.map}") String myValue) {
this.myValue = myValue;
}
public String getMyValue() {
return myValue;
}
}
Run Code Online (Sandbox Code Playgroud)