4.7.3 FileSystemResource 警告
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");