使用 Spring 3.1 的属性抽象动态访问属性



我正在尝试从Spring的环境属性抽象动态访问属性。

我这样声明我的属性文件:

<context:property-placeholder
    location="classpath:server.common.properties,
    classpath:server.${my-environment}.properties" />

在我的属性文件server.test.properties中,我定义了以下内容:

myKey=foo

然后,给定以下代码:

@Component
public class PropertyTest {
    @Value("${myKey}")
    private String propertyValue;
    @Autowired 
    private PropertyResolver propertyResolver;
    public function test() {
         String fromResolver = propertyResolver.getProperty("myKey");
    }
}

当我运行这段代码时,我最终得到propertyValue='foo',但fromResolver=null;

接收propertyValue表示正在读取属性,(我从代码的其他部分知道这一点)。但是,尝试动态查找它们是失败的。

为什么?如何动态查找属性值,而不必使用@Value ?

简单地添加<context:property-placeholder/>并不会向环境添加新的PropertySource。如果你完全阅读了你链接的文章,你会看到它建议注册一个ApplicationContextInitializer,以便添加新的propertysource,这样它们就可以在你试图使用它们的方式。

为了使其工作,我必须将属性的读取拆分为@Configuration bean,如下所示。

完整的示例如下:

@Configuration
@PropertySource("classpath:/server.${env}.properties")
public class AngularEnvironmentModuleConfiguration  {
    private static final String PROPERTY_LIST_NAME = "angular.environment.properties";
    @Autowired
    private Environment environment;
    @Bean(name="angularEnvironmentProperties")
    public Map<String,String> getAngularEnvironmentProperties()
    {
        String propertiesToInclude = environment.getProperty(PROPERTY_LIST_NAME, "");
        String[] propertyNames = StringUtils.split(propertiesToInclude, ",");
        Map<String,String> properties = Maps.newHashMap();
        for (String propertyName : propertyNames)
        {
            String propertyValue = environment.getProperty(propertyName);
            properties.put(propertyName, propertyValue);
        }
        return properties;
    }
}

最新更新