ResourceLoader 接口的目的是由可以返回(也就是加载)资源实例的对象来实现。下面的列表显示了ResourceLoader 接口的定义:
public interface ResourceLoader {
Resource getResource(String location);
ClassLoader getClassLoader();
}
所有的应用程序上下文(是指 xxxApplicationContext,比如 ClassPathXmlApplicationContext)都实现了 ResourceLoader 接口。因此,所有的应用程序上下文都可以被用来获取资源实例。
当你在一个特定的应用程序上下文上调用 getResource()
,并且指定的位置路径没有特定的前缀,你会得到一个适合该特定应用程序上下文的资源类型。例如,假设下面这段代码是针对一个 ClassPathXmlApplicationContext 实例运行的:
// ctx 就是 ClassPathXmlApplicationContext 的实例
Resource template = ctx.getResource("some/resource/path/myTemplate.txt");
针对 ClassPathXmlApplicationContext,该代码返回 ClassPathResource
。如果针对 FileSystemXmlApplicationContext 实例运行相同的方法,则会返回 FileSystemResource。对于 WebApplicationContext,它将返回一个 ServletContextResource。同样地,它将为每个上下文返回适当的对象。
因此,你可以以适合于特定应用环境的方式加载资源。
另一方面,你也可以通过指定特殊的 classpath:
前缀,强制使用 ClassPathResource,而不管应用程序上下文类型如何,正如下面的例子所示:
Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");
同样地,你可以通过指定任何标准的 java.net.URL
前缀来强制使用 UrlResource。下面的例子使用了 file 和 https 的前缀:
Resource template = ctx.getResource("file:///some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("https://myhost.com/resource/path/myTemplate.txt");
下表总结了将 String
对象转换为 Resource
对象的策略:
Prefix | Example | Explanation |
---|---|---|
classpath: |
classpath:com/myapp/config.xml |
从 classpath 加载 |
file: |
file:///data/config.xml |
从文件系统加载,详见: FileSystemResourceCaveats. |
https: |
https://myserver/logo.png |
加载为 URL. |
没有特殊前缀 | /data/config.xml |
取决于底层的 ApplicationContext. |