spring源码解析-资源管理Resource

spring框架api中文版.zip(spring开发手册) 有两种格式,一种和jdk的api一样,另一种是PDF格式,pdf部分目录如下: 即Spring框架的概述 1。 介绍Spring框架 1.1。 依赖注入和控制反转 1.2。 模块 1.2.1。 核心容器 1.2.2。 数据访问/集成 1.2.3。 web 1.2.4。 AOP和仪表 1 2 5。 测试 1.3。 使用场景 1.3.1。 依赖关系管理和命名约定 Spring依赖和依靠弹簧 Maven依赖管理 艾薇依赖管理 1.3.2。 日志 不使用通用日志 使用SLF4J 使用Log4j 二世。 什么是新的在春季3 2。 新特性和增强功能在Spring框架3.0 2.1。 Java 5 2.2。 改进文档 2.3。 新的文章和教程 2.4。 新模块的组织和构建系统 2.5。 概述的新特性 2 5 1。 核心api更新Java 5 2 5 2。 弹簧表达式语言 2 5 3。 这个控制反转(IoC)容器 基于Java bean的元数据 元数据定义bean组件内 立即下载

spring提供了常用的资源解析类,我们在平时读取文件过程中也可以直接采用,下面是我画的类图结构
资源类图
下面我进行一一介绍

/**
 * java通过class和classLoader获取资源的方式
 * @author q
 */
public class GetResourceTest {
    public static void main(String[] args) {
        //如果以'/'开头则从classpath路劲下获取
        System.out.println(GetResourceTest.class.getResource(""));
        System.out.println(GetResourceTest.class.getResource("/"));

        /**
         * classloader不能以'/'开头,否则为空,classloader是从classpath跟路劲开始获取
         */
        System.out.println(GetResourceTest.class.getClassLoader().getResource(""));
        System.out.println(GetResourceTest.class.getClassLoader().getResource("/"));
    }
}
/**
 * spring 资源获取策略
 * @author q
 *
 */
public class ResourceTest {
    public static void main(String[] args) throws IOException, URISyntaxException {
        /**
         * UriResource,通过网络协议读取文件资源
         */
        Resource res = new UrlResource("file:///D:/API/JAVA_API_1.7.chm");
        res.getFile();

        URI uri = new URI("file:///D:/API/JAVA_API_1.7.chm");
        System.out.println(uri.getSchemeSpecificPart());

        File file = new File("///D:/API/JAVA_API_1.7.chm");
        System.out.println(file.exists());

        /**
         * ClassPathResource最后通过this.classLoader.getResource(this.path)来获取资源,所以必须制定包路劲
         * @see GetResourceTest
         */
        res = new ClassPathResource("org/bear/bookstore/test/resource/application-orcl1.properties");
        System.out.println(res.getFile().exists());

        /**
         * InputStream不做解读
         */
        //res = new InputStreamResource(null);

        /**
         * To be used as placeholder if a {@code Resource} argument is
         * expected by an API but not necessarily used for actual reading
         */
        //res = new DescriptiveResource("file from native....");

        /**
         * ByteArrayResource不具体解读
         */
        //res = new ByteArrayResource(null);

        /**
         * FileSystemResource直接采用Java的File作为流
         */
        res = new FileSystemResource("D:/API/JAVA_API_1.7.chm");
        System.out.println("FileSystemResource:" + res.getFile().exists());

        /**
         * PathResource直接采用java中@see java.nio.Paths 获取流
         */
        res = new PathResource("D:/API/JAVA_API_1.7.chm");
        System.out.println("PathResource:" + res.getFile().exists());
    }
}

spring抽象出一个InputStreamResource接口,所有InputStream都可以作为资源供spring使用

public interface InputStreamSource {
    InputStream getInputStream() throws IOException;
}

抽象Resource作为资源判断、操作的接口,提供了一下操作

//是否存在
boolean exists();
//是否可读
boolean isReadable();
//是否已经打开
boolean isOpen();
//获取URL地址
URL getURL() throws IOException;
//获取资源定位符
URI getURI() throws IOException;
//获取文件
File getFile() throws IOException;
//获取资源大小
long contentLength() throws IOException;
//获取文件最后修改日期
long lastModified() throws IOException;
//
Resource createRelative(String relativePath) throws IOException;
//获取文件名
String getFilename();
//获取资源描述
String getDescription();

提供AbstractResource作为Resource接口的实现,注意其中几个方法,均需要其子类实现的,以为每一种方式都不相同,为设计模式策略模式的简单应用

public URL getURL() throws IOException {
    throw new FileNotFoundException(getDescription() + " cannot be resolved to URL");
}
public File getFile() throws IOException {
    throw new FileNotFoundException(getDescription() + " cannot be resolved to absolute file path");
}
public Resource createRelative(String relativePath) throws IOException {
    throw new FileNotFoundException("Cannot create a relative resource for " + getDescription());
}

剩下的子类就不多解释,资源管理并不复杂,spring提供多种方式获取资源:通过Url获取远程服务器资源,通过classLoader获取classpath下面的资源,通过File、Paths获取本地资源;我们也可以实现自己的资源获取策略供系统使用,有兴趣的可以自己尝试

补充

spring还提供了EncodedResource类,对Resource进行包装,提供通过不同编码方式读取资源文件,采用InputStreamReader读取Resource的流信息

public Reader getReader() throws IOException {
    if (this.charset != null) {
        return new InputStreamReader(this.resource.getInputStream(), this.charset);
    }
    else if (this.encoding != null) {
        return new InputStreamReader(this.resource.getInputStream(), this.encoding);
    }
    else {
        return new InputStreamReader(this.resource.getInputStream());
    }
}

近期准备深度研究spring源码,有工作中没有了解的关于spring的东西,大家可以提出来,我会有针对性研究和写文章,有什么写的不好的希望大家指正,谢谢

MOS管驱动电路设计全攻略 阅读详情

相关推荐

Goldwasser-Micali 公钥加密系统

1、二次剩余问题 对于整数n ,定义Zn∗={a∈Zn,gcd(a,n)=1}Z^*_n=\{ a∈Z_n,gcd(a,n) =1\}Zn∗​={a∈Zn​,gcd(a,n)=1} 。当存在d∈Znd \in Z_nd∈Zn​ ,使得 d2≡a mod nd^2 \equiv a \, mod \,nd2≡amodn ,称 a 为模 n 的二次剩余;否则称 a 为模 n的二次非剩余。判断 a 是否为模 n 的二次剩余的问题称为模n 的二次剩余问题。 \rule[-10pt]{14.3cm}{0.05em}

不染心的博客 4312

6.Spring快速入门(配置文件及API详解)

日常总结

qq_44438941的博客 412

属性基加密(Attribute-based Encryption, ABE)

KP-ABE中,用户的密钥定义了访问策略,密文的属性与策略进行匹配。CP-ABE中,密文定义了访问策略,用户的属性与策略进行匹配。

2201_75392924的博客 1830

EncodedResource类解读

EncodedResource是spring中Resource编码相关的封装类,EncodedResource里面封装了一个Resource成员属性,其实主要功能就是通过指定的编码获取资源的输入流。EncodedResource主要看getReader()方法,这个方法通过指定的编码方式返回InputStreamReader。...

qq_43203949的博客 796

【Zotero】《纯操作讲解,GPT配置,Zotero标注可视化》- 知识点目录

Temperature分布在。之间,越低输出越稳定;

墨门 3394

Spring框架常用的API

解释一下api是什么:api是技术中预先定义的一些函数和接口 1.ApplicationContext接口 有三个实现类用来加载applicationContext.xml文件 1.ClassPathXmlAppliactionContext类:从类的根目录下加载配置文件(常用) 2.FileSystemApplicationContext类:从磁盘路径下加载配置文件(不常用) 3.AnnotationConfigApplicationContext类:使用注解类作为spring的配置类,加载该注

qq_45754346的博客 2441

Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的理论简述和python仿真实现(附源码)

经典论文Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的学习与编程仿真,提供源码

m0_59701926的博客 1234

Spring的核心API

1.applicationContext 作用:Spring提供的ApplicationContext这个工厂,用于对象的创建。 好处:解耦合。 接口类型: 非web环境下:ClassPathXmlApplicationContext web环境下:XmlWebApplicationContext 2.重量级资源 ①ApplicationContext工厂的对象占用大量内存。 ②不会频繁的创建对象:一个应用只会创建一个对象。 ③ApplicationC...

weixin_47994966的博客 921

DeepSeek-V4-Pro 正式版突袭上线:Agent 能力暴涨,DeepSWE 直接干翻 Claude Opus 4.8

8 月 12 日深夜,DeepSeek 悄悄在 API 文档里上架了一个新版本号——DeepSeek-V4-Pro-0813。第二天(13 日),这个版本被确认为 V4 Pro 正式版。没有发布会,没有预热,只改了版本号,就把整个 AI 圈的注意力又抢了过去。

2601_96613114的博客 837

【AI产品思路】用户旅程图与用户全生命周期:到底是什么关系?

用户旅程图(User Journey Map)和用户全生命周期(User Lifecycle)是两种不同的分析框架。用户旅程聚焦单次交易体验的完整过程(如浏览→下单→售后),关注触点、情绪和优化点;而用户生命周期则关注用户与平台的长期关系(从认知到流失),着重提升留存和LTV。两者互为补充:生命周期是时间维度的关系框架,旅程图是行为维度的体验路径。电商运营中,旅程优化改善单次体验,生命周期优化解决长期增长问题,二者结合才能实现体验提升与商业效率的双赢。

qq_25438419的博客 216

Spring核心API介绍

Spring核心API介绍 BeanFactory org.springframework.beans.factory BeanFactory是用于访问Spring Bean容器的根接口,典型的工厂模式,用于生产Bean的一个Bean工厂,其提供了生产Bean所需的最基本规则。 BeanFactory的所有方法: BeanDefinition 功能 BeanDefinition是bean在spring中的描述,有了BeanDefinition我们就可以创建Bean,Be...

Xx__WangQi的博客 1993

KylinOS 离线安装 MinIO【图文步骤】

在国产操作系统 KylinOS 中安装 MinIO,详细步骤...

甘蓝的专栏 1533

Spring Resource体系中的Java继承与多态实践

继承与多态是面向对象编程的核心概念,通过建立层次结构和实现运行时动态绑定,显著提升代码的扩展性和可维护性。在Java生态中,Spring框架的Resource体系是这一理念的经典实践,它通过Resource接口统一抽象各类资源操作,利用抽象类封装通用逻辑,再由具体实现类处理不同协议(如classpath、file、http等)的差异化实现。这种设计模式不仅降低了模块耦合度,还支持通过新增实现类无缝扩展新协议。对于开发者而言,理解ResourceLoader的工厂方法机制和AbstractResource的模

weixin_30702441的博客 220

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

新手也能学得会之Resource 接口【sping-core-资源管理01】

Spring Framework 资源管理核心解析 摘要: 本文深入剖析了Spring Framework 6.2.7版本中资源管理的核心设计。通过分层架构分析,重点讲解了spring-core模块的Resource体系: 核心接口解析 InputStreamSource:定义资源输入流标准 Resource:统一资源访问接口,提供exists()/getInputStream()等通用方法 具体实现包括UrlResource(网络)、FileSystemResource(文件系统)、

土司先生的博客 1102

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring 源码解读:手动实现Spring的资源管理机制

Spring 的 `Resource` 抽象层提供了一个灵活的资源管理机制,支持从多种来源加载资源。本文将通过手动实现一个资源管理器,展示如何加载和解析多种资源类型,并与 Spring 的 `Resource` 抽象层进行对比,帮助读者掌握资源管理的设计思想和应用场景。

捕风捉你 · 星桥API接入与大模型实战 1422

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring 资源管理 (Resource)

Java 中有各种各样的资源,资源的位置包括本地文件系统、网络、类路径等,资源的形式可以包括文件、二进制流、字节流等,针对不同的资源又有不同的加载形式。本地文件系统中的文件在 Java 中使用 File 表示,使用 FileInputStream 读取。网络上的资源使用 URL 表示,使用 URLConnection 获取 InputStream 进行读取。而类路径下的资源使用 ClassLoader 进行读取。为了使用统一的方式访问资源,Spring 将资源抽象为 Resource,将资源的加载抽象为

大鹏的博客 2147

Spring源码学习-第二课-IOC资源管理之Resource

java自带的,虽然定位为统一资源定位器(Uniform Resource Locator),但是我们知道它基本只实现了只限于网络形式发布的资源的查找和定位。但是,实际上,资源的定义是相当广泛的,除了网络形式的资源,还有二进制、文件形式、字节流形式的资源的,而且他们存在的地方也是多种多样的,例如网络、应用程序、文件系统中。所以的局限性是相当大的,因此Spring就必须实现自己的资源管理策略。职能划分清楚,资源的定义和资源的加载必须分开。统一的抽象。统一的资源定义和资源加载策略。

小林同学的博客 352

Spring源码分析——资源访问利器Resource之实现类分析

http://doc.okbase.net/zrtqsk/archive/105869.html 今天来分析Spring的资源接口Resource的各个实现类。关于它的接口和抽象类,参见上一篇博文——Spring源码分析——资源访问利器Resource之接口和抽象类分析   一、文件系统资源 FileSystemResource   文件系统资源 ...

diaojin6880的博客 322

Spring Framework源码解析——PropertiesLoaderUtils

本文深入剖析了Spring Framework中的PropertiesLoaderUtils工具类,详细介绍了其设计目标、核心功能、源码实现及与Spring配置体系的集成。文章重点分析了该工具类的核心方法,包括单资源加载、多资源合并加载、字符编码处理等关键功能,并通过源码解读揭示了其内部实现机制。同时,文章还探讨了PropertiesLoaderUtils在Spring配置体系中的实际应用场景,如与PropertySourcesPlaceholderConfigurer的集成,并提供了最佳实践建议,帮助开发

谷哥的小弟 1114

Spring Resource

Resouce介绍 资源管理在工作中我们平时并不怎么用,一般都是写好的,我们也没有深究过其中的原理,今天我就看着spring官方文档结合源码看看这一块的知识进行一个梳理. Resource接口在org.springframework.core.io public interface Resource extends InputStreamSource { boolean exists(); default boolean isReadable() { return this

260

spring源码:资源管理器Resource

//by yan 20191128 org.springframework.core.io

xyzroundo的专栏 634

astron-rpa 资源管理服务(Resource Service)深度解析:基于 Spring Boot 3 + MinIO/S3 的文件上传下载实战指南

本文以 astron-rpa 开源仓库中的 [backend/resource-service](https://link.gitcode.com/i/75f0dc292822a4a53df217436563d379) 模块(官方文档为 [backend/resource-service/README.zh.md](https://link.gitcode.com/i/3b89e9fbf1bd80

gitblog_00319的博客 123

Spring源码学习-第三课-IOC资源管理之ResourceLoader

经过两章节的讲述,关于 Spring 资源管理的过程已经分析完毕。Spring 提供了 Resource 和 ResourceLoader来统一抽象整个资源及其定位。使得资源与资源的定位有了一个更加清晰的界限,并且提供了合适的 Default类,使得自定义实现更加方便和清晰。AbstractResource 为 Resource 的默认实现类,它对 Resource接口做了统一的实现,子类继承该类后只需要覆盖相应的方法即可,同时对于自定义的 Resource 我们也是继承该类。

小林同学的博客 750

LunaTV 订阅配置实战:一条链接配齐全部播放源并自动更新

LunaTV(又名 MoonTV)是一款开源影视聚合播放器,它的订阅配置功能把一整套播放源 JSON 配置压缩成一条链接:粘进管理后台,拉取保存一次,视频源、自定义分类、直播频道就全部填好,还能按周期持续同步。 ## 先看清"空壳首页"的痛点 这一节回答"为什么必须走这套配置"。部署完打开站点,首页是一片空白:没有视频源、没有自定义分类、也没有直播频道。逐台服务器手写 JSON 既繁琐又容易漏。

gitblog_00529的博客 209

Spring学习之资源管理器(Resource)

今天开始Spring学习(希望发展的是Spring的源码学习的系列)的第一章。我们在用Spring做开发的时候,总免不了读取各种各样的资源文件,比如说Spring的xml配置文件、属性的配置文件properties文件等。这些资源文件可能在classPath下面、web容器的上下文中、网络上等等。虽然JDK将不同来源的资源抽象成URL,通过注册不同的handler(URLStreamHandler

398701344努力加油! 3041
上一篇: spring aop 自动创建代理BeanNameAutoProxyCreator详解
下一篇: java编程风格
非洲_bear
博客等级 码龄15年 23粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值