[源码系列:手写spring] IOC第六节:资源和资源加载器
主要内容

本节新增
Resource接口 定义对资源的抽象和访问,并且添加三个Resource接口的简单实现类。
FileSystemResource 文件系统资源的实现类
ClassPathResource classpath下资源的实现类
UrlResource 对java.net.URL进行资源定位的实现类
ResourceLoader接口 资源加载器接口
DefaultResourceLoader 加载器实现类
代码分支
核心代码
Resource
public interface Resource {
InputStream getInputStream() throws IOException;
}
ResourceLoader
public interface ResourceLoader {
Resource getResource(String location);
}
ClassPathResource
public class ClassPathResource implements Resource{
private final String path;
public ClassPathResource(String path) {
this.path = path;
}
@Override public InputStream getInputStream() throws FileNotFoundException {
InputStream stream = this.getClass().getClassLoader().getResourceAsStream(path);
if (stream == null) {
throw new FileNotFoundException(this.path + " cannot be opened because it does not exist");
}
return stream;
}
}
FileSystemResource
public class FileSystemResource implements Resource{
private final String filePath;
public FileSystemResource(String filePath) {
this.filePath = filePath;
}
@Override public InputStream getInputStream() throws IOException{
Path path = new File(this.filePath).toPath();
return Files.newInputStream(path);
}
}
UrlResource
public class UrlResource implements Resource{
private final URL url;
public UrlResource(URL url) {
this.url = url;
}
@Override public InputStream getInputStream() throws IOException {
URLConnection urlConnection = this.url.openConnection();
return urlConnection.getInputStream();
}
}
DefaultResourceLoader
public class DefaultResourceLoader implements ResourceLoader{
public static final String CLASSPATH_URL_PREFIX = "classpath:";
@Override public Resource getResource(String location) {
if(location.startsWith(CLASSPATH_URL_PREFIX)){
return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()));
}else {
try {
URL url = new URL(location);
return new UrlResource(url);
}catch (Exception e){
return new FileSystemResource(location);
}
}
}
}
测试
@Test
public void test() throws IOException {
DefaultResourceLoader loader = new DefaultResourceLoader();
//classpath下资源的加载
Resource resource = loader.getResource("classpath:test.txt");
InputStream inputStream = resource.getInputStream();
String content = IoUtil.readUtf8(inputStream);
System.out.println("classpath - 资源内容测试:"+content);
//文件系统资源的加载
resource = loader.getResource("src/test/resources/test.txt");
inputStream = resource.getInputStream();
content = IoUtil.readUtf8(inputStream);
System.out.println("文件系统 - 资源内容测试:"+content);
//url资源的加载
resource = loader.getResource("https://blog.csdn.net/weixin_43848166");
inputStream = resource.getInputStream();
content = IoUtil.readUtf8(inputStream);
System.out.println("URL - 资源内容测试:"+content);
}
测试结果
classpath - 资源内容测试:hello-word
文件系统 - 资源内容测试:hello-word
URL - 资源内容测试:<!doctype html><html lang="zh" data-server-rendered="true" data-v-52866abc><head><title>一辉ComeOn的博客_CSDN博客-Spring源码剖析,每日算法,MySQL进阶领域博主</title>
...
[源码系列:手写spring] IOC第六节:资源和资源加载器的更多相关文章
- Spring源码分析 手写简单IOC容器
Spring的两大特性就是IOC和AOP. IOC Container,控制反转容器,通过读取配置文件或注解,将对象封装成Bean存入IOC容器待用,程序需要时再从容器中取,实现控制权由程序员向程序的 ...
- 《四 spring源码》手写springioc框架
手写SpringIOCXML版本 /** * 手写Spring专题 XML方式注入bean * * * */ public class ClassPathXmlApplicationContext { ...
- 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)
一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...
- 从零开始手写 spring ioc 框架,深入学习 spring 源码
IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...
- 《四 spring源码》手写springmvc
手写SpringMVC思路 1.web.xml加载 为了读取web.xml中的配置,我们用到ServletConfig这个类,它代表当前Servlet在web.xml中的配置信息.通过web.xml ...
- Spring源码 20 手写模拟源码
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
- 框架源码系列十二:Mybatis源码之手写Mybatis
一.需求分析 1.Mybatis是什么? 一个半自动化的orm框架(Object Relation Mapping). 2.Mybatis完成什么工作? 在面向对象编程中,我们操作的都是对象,Myba ...
- 利用递归,反射,注解等,手写Spring Ioc和Di 底层(分分钟喷倒面试官)了解一下
再我们现在项目中Spring框架是目前各大公司必不可少的技术,而大家都知道去怎么使用Spring ,但是有很多人都不知道SpringIoc底层是如何工作的,而一个开发人员知道他的源码,底层工作原理,对 ...
- Spring源码剖析3:Spring IOC容器的加载过程
本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...
- 源码分析 | 手写mybait-spring核心功能(干货好文一次学会工厂bean、类代理、bean注册的使用)
作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言介绍 一个知识点的学习过程基本分为:运行helloworld ...
随机推荐
- cpa-审计
1.审计概述 2.审计计划 3.审计证据 4.审计抽样方法 5.信息技术对审计的影响 6.审计工作底稿 7.风险评估 8.风险应对 9.销售与收款循环的审计 10.采购与付款循环的审计 11.生产与存 ...
- 第四章 对称加密算法--DES--AES--IDEA--PBE
10.1.DES 已破解,不再安全,基本没有企业在用了 是对称加密算法的基石,具有学习价值 密钥长度56(JDK).56/64(BC) 10.2.DESede(三重DES) 早于AES出现来替代DES ...
- MongoDB:集群和安全
MongoDB中的副本集(Replica Set)是一组维护相同数据集的mongod服务. 副本集可提供冗余和高可用性,是所有生产部署的基础.也可以说,副本集类似于有自动故障恢复功能的主从集群.通俗的 ...
- Docker的启停与配置等
Docker测试题 一.选择题(每题5分) 1.关于Docker 安装的表述错误的是(C) A.Docker支持在Windows.Linux.MacOS等系统上安装 B.CentOS安装Docker有 ...
- ORM(Object Relational Mapping:对象关系映射)
了解orm,先了解以下概念: 什么是"持久化" 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的数据存 ...
- android studio编译flutter项目
1创建flutter项目:如下图 2选择 flutter application 3 出现flutter SDK没有发现:但是自己又是安装了的 如果,忘记自己flutter安装在哪里的同学. 可以先找 ...
- verilog 编写猫狗过河实验
源代码地址:https://github.com/penggeon/catanddog 效果演示见: https://www.bilibili.com/video/BV1n24y147S1 警告: 仅 ...
- 初识VPC网络的能力
本文分享自天翼云开发者社区<初识VPC网络的能力>,作者:布小匠 VPC网络的来源 在云计算早期是没有VPC的概念的,有的是虚拟网络和虚拟路由器的功能.虚拟网络的作用是为用户提供一个虚拟的 ...
- 天翼云亮相操作系统大会&openEuler Summit 2023,斩获多项大奖!
近日,由开放原子开源基金会等主办,以"崛起数字时代 引领数智未来"为主题的操作系统大会&openEuler Summit 2023在北京举行.大会邀请院士.产业组织及全球开 ...
- shell 条件语句基础练习
#输出1到15数字 #!/bin/bash for i in `seq 1 15` do echo -e "\033[32m$i\033[0m" done #计算1到100数字之和 ...