【问题标题】:How to get the path to a properties file and pass it to a bean at runtime如何获取属性文件的路径并在运行时将其传递给 bean
【发布时间】:2011-08-30 16:16:26
【问题描述】:

我有一个由 Spring 创建的 bean。实际的类驻留在与 Spring 不同的 JAR 中。这个 bean 作为构造函数参数传递了一个路径。但是,我很难检索文件的句柄。该文件位于 WEB-INF/classes/ 中。我尝试过基于 WEB-INF 的相对路径,但显然没有奏效。

XML:

 <bean id="configurationManager" class="package.ConfigurationManager" 
      scope="singleton">           
      <property name="configurationMapping">
            <bean class="package.PropertiesFileConfigurationMapper">
                <constructor-arg type="java.lang.String">
                    <value>/path/to/file</value>
                </constructor-arg>
            </bean> 
      </property>                     
</bean> 

豆子:

public class ConfigurationMapper {

    public ConfigurationMapper(String resource) {
            _map = new HashMap<String, String>();
        String property = null;
        BufferedReader reader = null;
        try {
            FileReader file = new FileReader(resourcePath);
            reader = new BufferedReader(file);
            while ((property = reader.readLine()) != null) {
                if (property.matches("(.+)=(.+)")) {
                    String[] temp = property.split("(.+)=(.+)");
                    _map.put(temp[0], temp[1]);
                }
            }
        } catch (Exception ex){
            ex.printStackTrace();
        } finally {
            if (reader != null)
                reader.close();
        }
    }

    //other methods to manipulate settings
}

如何获得rm.properties 文件的正确路径并在运行时将其传递给bean?

编辑:添加了构造函数代码。

编辑:我明白了。我将构造函数参数更改为不再采用路径。它现在需要一个资源,所以 Spring 找到了我想要加载的资源。

【问题讨论】:

  • 试试类路径后缀。我的意思是类路径:filpath。

标签: java spring


【解决方案1】:

java.io.FileFileReader 仅适用于实际文件。打包在 JAR 文件中的资源本身并不是文件。

加载它的最简单方法是作为类路径资源:

替换这个:

FileReader file = new FileReader(resourcePath);
reader = new BufferedReader(file);

类似这样的:

InputStream inputStream = getClass().getResourceAsStream();
reader = new BufferedReader(new InputStreamReader(inputStream));

更好的是,使用 Spring 的 Resource 抽象,将构造函数参数声明为 org.springframework.core.io.Resource

public ConfigurationMapper(Resource resource) {
   ...
   InputStream inputStream = resource.getInputStream();
   reader = new BufferedReader(new InputStreamReader(inputStream));

当您随后提供路径时:

<constructor-arg value="classpath:/path/to/file"/>

Spring 将自动为该路径创建一个ClasspathResource(使用类路径),并将其传递给您的构造函数。

【讨论】:

  • 是的。这就是我所做的,但在你建议之前,我发现一篇文章提到了这个策略。
【解决方案2】:

Spring 有一个复杂的资源声明。您可以声明文件、类路径或用您自己的想法对其进行扩展。一切都基于资源 URI。由于您的文件位于 jar 文件中,因此您可以使用类路径加载它:

        <bean class="package.PropertiesFileConfigurationMapper">
            <constructor-arg>
                <value>classpath:/path/to/file/in/jar</value>
            </constructor-arg>
        </bean> 

现在修改您的构造函数以采用 java.io.InputStream。

public ConfigurationMapper(InputStream resource) {
    BufferedReader reader = new BufferedReader( new InputStreamReader( resource ) );
    ....
}

【讨论】:

    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多