Spring中的资源加载策略

简介:

本文是阅读《Spring揭秘》的笔记

  1. 资源表示:Resource
    Spring框架内部使用org.springframework.core.io.Resouce接口作为所有资源的抽象和访问接口。

    //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框架提供了一些实现类:

    • ByteArrayResource。将字节数组作为资源进行封装,如果通过InputStream形式访问该类型的资源,该实现会根据字节数组的数据,构造出对应的ByteArrayInputStream并返回。
    • ClassPathResource。从Java应用的classpath中加载具体的资源并封装,可以使用指定的类加载器或者给定的类进行资源加载。
    • FileSystemResource。可以以文件或者URL的形式对该资源进行访问,只要能跟File打的交道,基本上跟FileSystemResource也可以。
    • UrlResource。通过java.net.URL进行具体资源查找定位的实现类。
    • InputStreamResource。将给定的InputStream视为一种资源的Resource实现类,比较少用。
  2. 资源加载:ResourceLoader
    在Spring框架中,ResourceLoader是资源查找定位策略的统一抽象,具体的资源查找定位策略由相应的ResourceLoader实现类给出。ResouceLoader的定义如下:

    public interface ResourceLoader {
     String CLASSPATH_URL_PREFIX = "classpath:";
     Resource getResource(String var1);
     ClassLoader getClassLoader();
    }
  3. 批量加载资源:ResourcePatternResolver

    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的关系

    相关文章
    |
    2月前
    |
    消息中间件 Java 调度
    Spring Boot 3.3 后台任务处理的高效策略
    【10月更文挑战第18天】 在现代应用程序中,后台任务处理对于提升用户体验和系统性能至关重要。Spring Boot 3.3提供了多种机制来实现后台任务处理,包括异步方法、任务调度和使用消息系统。本文将探讨这些机制的最佳实践,帮助开发者提高应用程序的效率和响应速度。
    41 0
    |
    3月前
    |
    缓存 安全 Java
    Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
    从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
    238 24
    Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
    |
    5月前
    |
    安全 Java 数据安全/隐私保护
    解析Spring Security中的权限控制策略
    解析Spring Security中的权限控制策略
    |
    2月前
    |
    消息中间件 监控 Java
    Spring Boot 3.3 后台任务处理:最佳实践与高效策略
    【10月更文挑战第10天】 在现代应用程序中,后台任务处理对于提高应用程序的响应性和吞吐量至关重要。Spring Boot 3.3提供了多种机制来实现高效的后台任务处理,包括异步方法、任务调度和使用消息队列等。本文将探讨这些机制的最佳实践和高效策略。
    90 0
    |
    3月前
    |
    XML 存储 Java
    spring源码刨析-spring-beans(内部核心组件,beanDefinition加载过程)
    spring源码刨析-spring-beans(内部核心组件,beanDefinition加载过程)
    |
    3月前
    |
    负载均衡 Java 对象存储
    负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
    负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
    53 2
    |
    2月前
    |
    安全 算法 Java
    强大!基于Spring Boot 3.3 六种策略识别上传文件类型
    【10月更文挑战第1天】在Web开发中,文件上传是一个常见的功能需求。然而,如何确保上传的文件类型符合预期,防止恶意文件入侵,是开发者必须面对的挑战。本文将围绕“基于Spring Boot 3.3 六种策略识别上传文件类型”这一主题,分享一些工作学习中的技术干货,帮助大家提升文件上传的安全性和效率。
    53 0
    |
    3月前
    |
    前端开发 JavaScript Java
    技术分享:使用Spring Boot3.3与MyBatis-Plus联合实现多层次树结构的异步加载策略
    在现代Web开发中,处理多层次树形结构数据是一项常见且重要的任务。这些结构广泛应用于分类管理、组织结构、权限管理等场景。为了提升用户体验和系统性能,采用异步加载策略来动态加载树形结构的各个层级变得尤为重要。本文将详细介绍如何使用Spring Boot3.3与MyBatis-Plus联合实现这一功能。
    126 2
    |
    3月前
    |
    消息中间件 NoSQL 安全
    (转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
    这篇文章介绍了Spring Boot加载配置文件的顺序规则,包括不同位置的application.properties文件的加载优先级,以及如何通过命令行参数或环境变量来指定配置文件的名称和位置。
    |
    4月前
    |
    Java Spring
    Spring boot +Thymeleaf 本地图片加载失败(图片路径)的问题及解决方法
    这篇文章详细讲解了在Spring Boot应用程序中本地图片无法加载的问题原因,并提供了两个示例来说明如何通过使用正确的相对路径或Thymeleaf语法来解决图片路径问题。