本文是阅读《Spring揭秘》的笔记
//Resource接口的定义
public interface Resource extends InputStreamSource {
boolean exists();
boolean isReadable();
boolean isOpen();
URL getURL() throws IOException;
URI getURI() throws IOException;
File getFile() throws IOException;
long contentLength() throws IOException;
long lastModified() throws IOException;
Resource createRelative(String var1) throws IOException;
String getFilename();
String getDescription();
}
Resouce接口可以根据资源的不同类型,或者资源位置的不同,给出对应的具体实现,Spring框架提供了一些实现类:
public interface ResourceLoader {
String CLASSPATH_URL_PREFIX = "classpath:";
Resource getResource(String var1);
ClassLoader getClassLoader();
}
public interface ResourcePatternResolver extends ResourceLoader {
String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
Resource[] getResources(String var1) throws IOException;
}
最后,可以用一张图表示Spring的统一资源加载策略,如下图所示:
Resource和Resource Loader层次图
回过头来,再看下BeanFactory和ApplicationContext的继承关系图:
BeanFactory和ApplicationContext的继承关系图
ApplicationContext继承了ResourcePatternResolver,当然就间接实现了ResourceLoader接口。所以,任何的ApplicationContext实现都可以看作是一个ResourceLoader甚至ResourcePatternResolver。而这就是ApplicationContext支持Spring内统一资源加载策略的真相。
通常,所有的ApplicationContext实现类会直接或者间接地继承org.springframework.context.support.AbstractApplicationContext,从这个类上,我们就可以看到Application-Context与ResourceLoader之间的所有关系。AbstractApplicationContext继承了DefaultRe-sourceLoader,那么,它的getResource(String)当然就直接用DefaultResourceLoader的了。
剩下需要它“效劳”的,就是ResourcePatternResolver的Resource[]getResources (String),当然,AbstractApplicationContext也不负众望,当即拿下。AbstractApplicationContext类的内部声明有一个resourcePatternResolver,类型是ResourcePatternResolver,对应的实例类型为PathMatchingResourcePatternResolver 。
之前我们说过PathMatchingResourcePattern-Resolver构造的时候会接受一个ResourceLoader,而AbstractApplicationContext本身又继承自DefaultResourceLoader,当然就直接把自身给“贡献”了。这样,整个ApplicationContext的实现类就完全可以支持ResourceLoader或者ResourcePatternResolver接口,你能说Application-Context不支持Spring的统一资源加载吗?说白了,ApplicationContext的实现类在作为ResourceLoader或者ResourcePatternResolver时候的行为,完全就是委派给了PathMatchingResource-PatternResolver和DefaultResourceLoader来做。
AbstractApplicationContext和ResourceLoader、ResourcePatternResolver的关系