ResourceLoader 接口的目的是由可以返回(也就是加载)资源实例的对象来实现。下面的列表显示了ResourceLoader 接口的定义:

    1. public interface ResourceLoader {
    2. Resource getResource(String location);
    3. ClassLoader getClassLoader();
    4. }

    所有的应用程序上下文(是指 xxxApplicationContext,比如 ClassPathXmlApplicationContext)都实现了 ResourceLoader 接口。因此,所有的应用程序上下文都可以被用来获取资源实例。

    当你在一个特定的应用程序上下文上调用 getResource(),并且指定的位置路径没有特定的前缀,你会得到一个适合该特定应用程序上下文的资源类型。例如,假设下面这段代码是针对一个 ClassPathXmlApplicationContext 实例运行的:

    1. // ctx 就是 ClassPathXmlApplicationContext 的实例
    2. Resource template = ctx.getResource("some/resource/path/myTemplate.txt");

    针对 ClassPathXmlApplicationContext,该代码返回 ClassPathResource。如果针对 FileSystemXmlApplicationContext 实例运行相同的方法,则会返回 FileSystemResource。对于 WebApplicationContext,它将返回一个 ServletContextResource。同样地,它将为每个上下文返回适当的对象。

    因此,你可以以适合于特定应用环境的方式加载资源。

    另一方面,你也可以通过指定特殊的 classpath:前缀,强制使用 ClassPathResource,而不管应用程序上下文类型如何,正如下面的例子所示:

    1. Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");

    同样地,你可以通过指定任何标准的 java.net.URL前缀来强制使用 UrlResource。下面的例子使用了 file 和 https 的前缀:

    1. Resource template = ctx.getResource("file:///some/resource/path/myTemplate.txt");
    2. 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.