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

时间:2013-05-23 03:10:39

标签: java spring

我正在尝试从Spring的Environment property abstraction动态访问属性。

我声明我的属性文件:

<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

2 个答案:

答案 0 :(得分:2)

简单地添加<context:property-placeholder/>不会向环境添加新的PropertySource。如果您阅读完全链接的文章,您会看到它建议注册ApplicationContextInitializer以添加新的PropertySource,以便它们以您尝试使用它们的方式提供。

答案 1 :(得分:1)

为了实现这一点,我不得不将属性的读取分解为@Configuration bean,作为shown here

以下是完整的示例:

@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;
    }
}

然后将这组属性注入其他地方,以供消费。