美文网首页
Resource,ResourceLoader,容器之间的微妙关

Resource,ResourceLoader,容器之间的微妙关

作者: 码而优则仕 | 来源:发表于2020-06-26 20:34 被阅读0次

Resource,ResourceLoader,容器之间的微妙关系

Resource

Spring将需要读取的资源抽象为Resource进行处理,

public interface Resource extends InputStreamSource {

EncodedResource提供对Resource资源的编解码等处理。

public class EncodedResource implements InputStreamSource {

AbstractResource实现了Resource的大部分功能,

public abstract class AbstractResource implements Resource {

基于AbstractResource Spring提供了三种可以直接使用的实例:

ServletContextResource,ClassPathResource,FileSystemResource

Resource接口中定义的都是读类型的方法,而如果具体类型的Resource实例需要拥有写类型的方法需要实现WritableResource接口

public interface WritableResource extends Resource {

ResourceLoader

Spring中每种类型的资源都有对应的Resource实现类对应,是否可以不使用对应的Resource,在知道资源位置的情况下就直接使用资源呢?

ResourceLoader强大的资源加载方式

  • 自动识别classpath,file,等资源地址前缀

  • 支持自动解析Ant风格带通配符的资源地址

Ant

路径匹配表达式,用来对URI进行匹配

和通配符的作用差不多,只是适用面仅仅用于路径匹配。

?表示匹配任意类型单字符

test/p?ocess可以匹配 test/process,test/poocess 但是不能匹配 test/pocess

*表示匹配0个或任意数量的字符

/test/*.jsp 匹配 test路径下的.jsp文件

/test/*/path 匹配 /test/path,/test/a/path,/test/b/path但是不匹配/test/a/b/path

**表示匹配0个或者更多的目录

/test/**/path 匹配 /test/path,/test/a/path,/test/b/path,/test/a/b/path

ResourcePatternResolver,PathMatchingResourcePatternResolver

这个接口是Spring提供的解析 Ant 表达式的接口,定义了解析Ant表达式的方法,PathMatchingResourcePatternResolver实现了这个接口

public class AntPathMatcher implements PathMatcher {
ResourceLoader:Spring提供了强大的资源加载方式,根据传入的资源地址,自动去构建出适配该资源的Resource实现类实例

实现不同Resource的加载策略,按需返回特定类型的Resource

DefaultResourceLoader:提供Resource接口的实现

根据不同路径返回不同的具体Resource实现类实例---策略模式

容器与ResourceLoader的关系:

ApplicationContext继承ResourcePatternResolver

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
      MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

ResourcePatternResolver继承ResourceLoader

public interface ResourcePatternResolver extends ResourceLoader {

AbstractApplicationContext继承自DefaultResourceLoader

public abstract class AbstractApplicationContext extends DefaultResourceLoader
      implements ConfigurableApplicationContext {

AbstractApplicationContext的如下方法获取ResourcePatternResolver

生成后在AbstractApplicationContext构造函数中使用

构造PathMatchingResourcePatternResolver的时候,将自己AbstractApplicationContext传入其中,充当ResourceLoader

protected ResourcePatternResolver getResourcePatternResolver() {
   return new PathMatchingResourcePatternResolver(this);
}
public AbstractApplicationContext() {
   this.resourcePatternResolver = getResourcePatternResolver();
}

然后在类AbstractApplicationContext中getResources方法被调用获取资源时,调用资源解析器解析资源

@Override
public Resource[] getResources(String locationPattern) throws IOException {
   return this.resourcePatternResolver.getResources(locationPattern);
}

综上可以知道ApplicationContext的任何实现类的实例本身就可以作为一个ResourceLoader,所以高级容器支持多资源的加载

相关文章

网友评论

      本文标题:Resource,ResourceLoader,容器之间的微妙关

      本文链接:https://www.haomeiwen.com/subject/luoufktx.html