FileSystemResource
没有依附 FileSystemApplicationContext
,因为FileSystemApplicationContext 并不是一个真正的 `ResourceLoader
。FileSystemResource
并没有按约定规则来处理绝对和相对路径。相对路径是相对与当前工作而言,而绝对路径则是相对文件系统的根目录而言。
然而为了向后兼容,当 FileSystemApplicationContext
是一个 ResourceLoader
实例式,我们做了一些改变 —— 不管 FileSystemResource` 实例的位置路径是否以 / 开头, FileSystemApplicationContext
都强制将其作为相对路径来处理。事实上,这意味着以下例子等效:
ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/context.xml");
ApplicationContext ctx = new FileSystemXmlApplicationContext("/conf/context.xml");
还有:(即使它们的意义不一样 —— 一个是相对路径,另一个是绝对路径。)
FileSystemXmlApplicationContext ctx = ...;
ctx.getResource("some/resource/path/myTemplate.txt");
FileSystemXmlApplicationContext ctx = ...;
ctx.getResource("/some/resource/path/myTemplate.txt");
实践中,如果确实需要使用绝对路径,建议放弃 FileSystemResource
/ FileSystemXmlApplicationContext
在绝对路劲的使用,而强制使用 file:
的 UrlResource
。
// Resource 只会是 UrlResource,与上下文的真实类型无关 ctx.getResource("file:///some/resource/path/myTemplate.txt");
// 强制 FileSystemXmlApplicationContext 通过 UrlResource 加载资源 ApplicationContext ctx = new FileSystemXmlApplicationContext("file:///conf/context.xml");