从Spring中的文件路径加载属性文件

时间:2015-08-10 09:54:23

标签: java spring filepath

我的应用程序上下文中有以下bean:

<bean id="httpClient" factory-method="createHttpClient" class="com.http.httpclient.HttpClientFactory">
    <constructor-arg>
        <bean id="httpConfig" class="com.http.httpclient.HttpClientParamsConfigurationImpl">
            <constructor-arg value="httpclient.properties"/>
        </bean>
    </constructor-arg>
</bean>

其中httpclient.properties是我的属性文件的名称。我在HttpClientParamsConfigurationImpl中使用此参数来读取文件(不要过多地考虑错误处理):

public HttpClientParamsConfigurationImpl(String fileName) {
  try(InputStream inputStream = new FileInputStream("resource/src/main/properties/" + fileName)) {
     properties.load(inputStream);
  } catch (IOException e) {
     LOG.error("Could not find properties file");
     e.printStackTrace();
  }
}

有没有办法传递bean中的整个文件位置,所以在创建resource/src/main/properties时我不必添加路径InputStream

我已尝试使用classpath:httpclient.properties,但它无法正常使用。

1 个答案:

答案 0 :(得分:3)

您的代码错误,文件位于类路径中(src/main/resources被添加到类路径中,并且其中的文件被复制到类路径的根目录。在您的情况下,在名为{{1}的子目录中})。而不是properties我建议您改用StringResource

Properties

然后在您的配置中,您只需编写以下内容:

public HttpClientParamsConfigurationImpl(Resource res) {
  try(InputStream inputStream = res.getInputStream()) { 
      properties.load(inputStream);
  } catch (IOException e) {
   LOG.error("Could not find properties file");
   e.printStackTrace();
  }
}

或者更好的是甚至不用加载属性,只需将它们传递给构造函数,让Spring为你做所有的硬加载。

<bean id="httpClient" factory-method="createHttpClient" class="com.http.httpclient.HttpClientFactory">
    <constructor-arg>
        <bean id="httpConfig" class="com.http.httpclient.HttpClientParamsConfigurationImpl">
            <constructor-arg value="classpath:properties/httpclient.properties"/>
        </bean>
    </constructor-arg>
</bean>

然后使用public HttpClientParamsConfigurationImpl(final Properties properties) { this.properties=properties } 加载属性并简单地为构造函数引用它。

util:properties

最后一个选项可以保持您的代码清洁,并使您免于加载等。