如何告诉Spring使用Java映射来解析属性占位符?

Max*_*Max 6 java spring

我有一个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)

Sot*_*lis 3

Spring 提供了一个MapPropertySource,您可以使用您的 注册ApplicationContextEnvironment您将需要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)