如何获取属性文件的路径并在运行时将其传递给bean

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

XML:

    /path/to/file     

豆:

 public class ConfigurationMapper { public ConfigurationMapper(String resource) { _map = new HashMap(); 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找到了我想加载的资源。

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)); 

然后,当您提供路径时:

  

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

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

    classpath:/path/to/file/in/jar   

现在修改构造函数以获取java.io.InputStream。

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