在工厂方法</context:property-placeholder>中使用<context:property-placeholder>定义的属性

时间:2012-10-08 12:35:03

标签: java spring properties

我编写了一个工厂bean,它根据在特定于应用程序的属性文件中配置的属性创建一个缓存管理器。

概念是可以选择多个实现,每个实现使用其他配置属性。

例如:

  • noop cache,不带参数,
  • 带#max对象的ehcache
  • 配置了多个ips和端口的内存缓存。

我认为不在application-context.xml中指定所有特定于缓存应用程序的参数,但是从现有属性源中读取它们是很好的。

我的尝试是使用EnvironementAware界面来访问Environement。但似乎使用<context:property-placeholder>配置的属性文件未包含在PropertiesSources中。

example.properties

cache.implementation=memcached
cache.memcached.servers=server1:11211,server2:11211

应用context.xml中

<context:property-placeholder location="example.properties"/>
<bean id="cacheManager" class="com.example.CacheManagerFactory"/>

在CacheManagerFactory.java中

public class CacheManagerFactory implements FactoryBean<CacheManager>, EnvironmentAware {

    private Environement env;

    @Override
    public CacheManager getObject() throws Exception {
        String impl = env.getRequiredProperty("cache.implementation"); // this fails
    //Do something based on impl, which requires more properties.
    }

    @Override
    public void setEnvironment(Environment env) {
        this.env = env;
    }

    @Override
    public Class<?> getObjectType() {
        return CacheManager.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

}

1 个答案:

答案 0 :(得分:3)

在这样的配置文件中:

 <context:property-placeholder location="classpath:your.properties" ignore-unresolvable="true"/>
  ...
 <property name="email" value="${property1.email}"/>
 <!-- or -->
 <property name="email">
   <value>${property1.email}</value>
 </property>

或代码:

@Value("${cities}")
private String cities;

你的.properties包含这个:

cities = my test string 
property1.email = answer@stackvoerflow.com