【小家Spring】资源访问利器---Spring使用ResourceLoader接口便捷的获取资源(ResourcePatternResolver、ResourceLoaderAware)(中)

简介: 【小家Spring】资源访问利器---Spring使用ResourceLoader接口便捷的获取资源(ResourcePatternResolver、ResourceLoaderAware)(中)


AbstractRefreshableWebApplicationContext


下面的子类都是和web相关了。所以就和ServletContext相关嘛~~~


// @since 1.1.3
public abstract class AbstractRefreshableWebApplicationContext extends AbstractRefreshableConfigApplicationContext
    implements ConfigurableWebApplicationContext, ThemeSource {
    ...
  @Override
  protected Resource getResourceByPath(String path) {
    Assert.state(this.servletContext != null, "No ServletContext available");
    return new ServletContextResource(this.servletContext, path);
  }
  // ServletContextResourcePatternResolver是PathMatchingResourcePatternResolver的子类 
  @Override
  protected ResourcePatternResolver getResourcePatternResolver() {
    return new ServletContextResourcePatternResolver(this);
  }
  ...
}


XmlWebApplicationContext


他没有自己的实现,但我们可议简单的回味一下它的类

public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext {
  /** Default config location for the root context */
  public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml";
  /** Default prefix for building a config location for a namespace */
  public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB-INF/";
  /** Default suffix for building a config location for a namespace */
  public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml";
  ...
}



AnnotationConfigWebApplicationContext

它是注解驱动的,所以也就没有必要冲洗方法喽 @since 3.0


GenericApplicationContext

public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry {
  ...
  // 它重写一个逻辑都是:加入调用者自己指定了resourceLoader,那就以调用者为准
  @Override
  public Resource getResource(String location) {
    if (this.resourceLoader != null) {
      return this.resourceLoader.getResource(location);
    }
    return super.getResource(location);
  }
  @Override
  public Resource[] getResources(String locationPattern) throws IOException {
    if (this.resourceLoader instanceof ResourcePatternResolver) {
      return ((ResourcePatternResolver) this.resourceLoader).getResources(locationPattern);
    }
    return super.getResources(locationPattern);
  }
  ...
}


image.png

如图的几个子类。除了带web的重写了一下(使用ServletContextResource和ServletContextResourcePatternResolver),其余子类都没有重写的必要~~~~


子接口 ResourcePatternResolver 解析


上面已经介绍了ResourceLoader的实现,那么接下来针对于子接口进一步讨论。其实它使用得反而更加的广泛,也更加的强大。从名字中可以看出,它支持Pattern,支持正则的模式匹配,非常的强大~~~


用于解析资源文件的策略接口,其特殊的地方在于,它应该提供带有*号这种通配符的资源路径。 此接口是ResourceLoader接口的拓展接口。


// @since 1.0.2 显然它出现的时机晚于ResourceLoader接口
public interface ResourcePatternResolver extends ResourceLoader {
  // 与ResourceLoader中classpath不同的地方在于,此前缀会在所有的JAR包的根目录下搜索指定文件。  非常的强大
  String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
  // 返回指定路径下所有的资源对象。
  // 返回的对象数组有Set的语义,也就是说,`对于同一个资源,只返回一个资源对象`
  Resource[] getResources(String locationPattern) throws IOException;
}


先来个Demo,简单的感受下classpath*的威力:


     public static void main(String[] args) throws IOException {
        ResourceLoader resourceLoader = new DefaultResourceLoader();
        Resource resource = resourceLoader.getResource("classpath:META-INF/spring.factories");
        // 因为`classpath:`只在本工程内查找,所以肯定找不到 spring.factories
        System.out.println(resource.exists()); //false
        PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        Resource[] resources = resourcePatternResolver.getResources("classpath*:META-INF/spring.factories");
        // 它会去找所有的jar包的类路径开始查找,所以现在是可议找到多个的~~~
        System.out.println(resources.length); //2
        System.out.println(Arrays.asList(resources));
        //[URL [jar:file:/E:/repository/org/springframework/spring-beans/5.0.6.RELEASE/spring-beans-5.0.6.RELEASE.jar!/META-INF/spring.factories],
        //URL [jar:file:/E:/repository/org/springframework/spring-test/5.0.6.RELEASE/spring-test-5.0.6.RELEASE.jar!/META-INF/spring.factories]]
        // 还能使用Ant风格进行匹配~~~  太强大了:
        resources = resourcePatternResolver.getResources("classpath*:META-INF/*.factories");
        System.out.println(resources); // 能匹配上所有了路径下,`META-INF/*.factories`匹配上的所有文件
        resources = resourcePatternResolver.getResources("classpath*:com/fsx/**/*.class");
        System.out.println(resources.length); //42 相当于把我当前项目所有的类都拿出来了
    }


image.png



相关文章
|
2月前
|
NoSQL Java 数据库连接
《深入理解Spring》Spring Data——数据访问的统一抽象与极致简化
Spring Data通过Repository抽象和方法名派生查询,简化数据访问层开发,告别冗余CRUD代码。支持JPA、MongoDB、Redis等多种存储,统一编程模型,提升开发效率与架构灵活性,是Java开发者必备利器。(238字)
|
3月前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
171 0
Spring中最大化@Lazy注解,实现资源高效利用
|
3月前
|
安全 数据可视化 Java
AiPy开发的 Spring 漏洞检测神器,未授权访问无所遁形
针对Spring站点未授权访问问题,现有工具难以检测如Swagger、Actuator等组件漏洞,且缺乏修复建议。全新AI工具基于Aipy开发,具备图形界面,支持一键扫描常见Spring组件,自动识别未授权访问风险,按漏洞类型标注并提供修复方案,扫描结果可视化展示,支持导出报告,大幅提升渗透测试与漏洞定位效率。
|
XML Java 数据格式
探索Spring之利剑:ApplicationContext接口
本文深入介绍了Spring框架中的核心接口ApplicationContext,解释了其作为应用容器的功能,包括事件发布、国际化支持等,并通过基于XML和注解的配置示例展示了如何使用ApplicationContext管理Bean实例。
572 6
|
自然语言处理 JavaScript Java
Spring 实现 3 种异步流式接口,干掉接口超时烦恼
本文介绍了处理耗时接口的几种异步流式技术,包括 `ResponseBodyEmitter`、`SseEmitter` 和 `StreamingResponseBody`。这些工具可在执行耗时操作时不断向客户端响应处理结果,提升用户体验和系统性能。`ResponseBodyEmitter` 适用于动态生成内容场景,如文件上传进度;`SseEmitter` 用于实时消息推送,如状态更新;`StreamingResponseBody` 则适合大数据量传输,避免内存溢出。文中提供了具体示例和 GitHub 地址,帮助读者更好地理解和应用这些技术。
2421 121
|
XML Java 数据格式
深入理解Spring中的Resource资源管理
深入理解Spring中的Resource资源管理
303 0
|
Java Spring
Spring Context 资源管理
Spring Context 资源管理
|
Java Spring 容器
Spring 资源管理 (Resource)
Spring 为什么引入资源管理? Java 中有各种各样的资源,资源的位置包括本地文件系统、网络、类路径等,资源的形式可以包括文件、二进制流、字节流等,针对不同的资源又有不同的加载形式。
189 0
Spring 资源管理 (Resource)