4

我正在尝试从 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

4

2 回答 2

2

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

于 2013-05-23T03:53:58.297 回答
1

为了让它工作,我必须将属性的读取拆分为一个@Configurationbean,如下所示

这是完整的示例:

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

然后将一组属性注入其他地方以供使用。

于 2013-05-23T04:06:18.963 回答