`
liu75675231
  • 浏览: 3336 次
文章分类
社区版块
存档分类
最新评论

菜鸟的spring 3.0源码学习之旅(1)

阅读更多
大家好,从今天开始,由我来讲解spring 3.0,希望大家多多捧场,提出批评
首先呢,我先介绍一下我自己吧,我呢叫小辞,20岁的小伙子,为了提升自己,为了和大家共同交流技术,所以,我把我每天学习spring 3.0源码的心得和经验还有自己的一点小小的体会与大家分享,希望大家多多捧场啦
还有呢,因为本人并不算是一个严格意义上的大学生(电气自动化的成考大专,你们懂的),所以呢,还有本人经验以及知识上的不足,我所说的东西不一定就是对的,希望大家怀着怀疑的心态去阅读我的体会。可能话相当的罗嗦,但是没办法,这就是我的思维,考虑的尽量全面一点,罗嗦就罗嗦吧,再说了,我也是一个菜鸟,菜鸟当然会对一些基础的,高手们不屑一顾的东西关心不已嘛。。。理解万岁吧
那么,开始正题吧
我想,大家对于org.springframework.core.io.Resource接口不是很陌生,今天呢,我们就讲解这个类以及它的子类org.springframework.core.io.FileSystemResource(如不特殊说明,今天所有的类都位于org.springframework.core.io包下面)
首先呢,我们先看一下他们的机构,Resource是一个接口,由AbstractResource抽象类实现部分公用的方法,然后呢,由各个子类去分别实现AbstractResource抽象类
对于Resource,我觉得没有什么好讲的,接口嘛。。。大家懂的,但是呢对于AbstractResource,我却产生了比较浓厚的兴趣,首先呢,在于它对于接口定义的那些方法的实现上面,比如说,大家看一下其中的几个语句
Org.springframework.core.io.AbstractResource#isReadable()
public boolean isReadable() {
return true;
}
Org.springframework.core.io.AbstractResource#isReadable()
public File getFile() throws IOException {
throw new FileNotFoundException(getDescription() + " cannot be resolved to absolute file path");
}
我想大家对于这两个语句不是很陌生,但是奇怪的就在于,为什么在这个方法里,它总是返回true,而对于第二个方法来说,它则是直接的抛出一个异常?
我想聪明的大家应该会很快的明白,这些其实是为了让子类去覆盖它们,也就是说,假如它们的实现类没有覆盖AbstractResource相应的方法的话,它们很可能会抛出异常,或者是这个方法很可能会失效
那么为什么要这么写呢?
我想地球人都知道,抽象类本身就是对于那些实现类高度抽象以后的结果,也就是说,这些方法都是以后它们的子类实现类必须需要实现的方法,因为每一个实现类对于每一个相同的方法的实现都不太相同,所以在抽象类中,考虑的主要就是假如实现类没有实现我的这个方法,我就必须要告知它们,或者抛出异常,或者失效
那么大家又可能会问,如果要是按照上面说的话的意思的话,那么这个AbstractResource岂不是可有可无呢,我想应该不是的,因为在这里并不是所有的方法都必须被覆盖,可能有基础不是很好的童鞋们可能会担心假如实现了这个抽象类是不是完全不能使用呢,那么,我可以很严肃的告诉你,抽象类以及接口是不能被实例化的,所以你们就大大的放心好了,不过可以用静态方法哦!
在很久很久以前,每当我看到大婶们写的那些非常牛的框架里,都喜欢加一个toString方法,以前觉得特神秘,有种大婶一样的气势!不过问了度娘才知道,这个方法是用来进行调试的,至于怎么调试呢,给个悬念啦
对于在Resource以及子类里,我个人实在理解不了getDescription()方法和toString()方法有什么不同
Org.springframework.core.io.AbstractResource#toString()
public String toString() {
return getDescription();
}
好嘛。。。。既然是用getDescription()方法实现的,那么完全就没必要写两个方法嘛,
Org.springframework.core.io.FileSystemResource#getDescription
public String getDescription() {
return "file [" + this.file.getAbsolutePath() + "]";
}
对于这个呢?我更加理解不了了,在我看来,完全就没必要这么写嘛。。。直接用file.toString()就好了嘛。难道是这样写觉得很酷?很正规?在这里还是求大神们解释下拉
在FileSystemResource类里,有两个字段
private final File file;
private final String path;
有了这两个字段,让我更加相信了Resource的底层用的其实还是File类以及它的方法,这个file文件还是private final的,并且没有相应的getter,setter方法,有这个我们可以知道,它的内核是隐藏的,不许修改的,但是这个又比File文件更加的规范,功能也更加全面,也更加的强壮,例如下面这个代码
Org.springframework.core.io.FileSystemResource#isReadable()
public boolean isReadable() {
return (this.file.canRead() && !this.file.isDirectory());
}
当我看到这个方法的时候,我才恍然大悟,原来在File文件里,对于目录是可读可写可执行的,当时我和小伙伴们都惊呆了,如果要是对于一个普通的txt文件来说,那么它是可读可写的,那么它的路径也是可读可写的,那么我们就有必要规范一下,在不是目录的情况下的文件时可读的,那才返回true,
以前我一直问自己,哈希码有什么用,我想在这里,它的用处其实就是一个身份证号码,用来确定引用的是不是同一个底层文件
Org.springframework.core.io.FileSystemResource#hashCode()
public int hashCode() {
return this.path.hashCode();
}
恩恩。。。我再让大家看一个构造器
public FileSystemResource(File file) {
Assert.notNull(file, "File must not be null");    //确保file不为null
this.file = file;
this.path = StringUtils.cleanPath(file.getPath()); 
}
很显然,这个是FileSystemResource的构造器,但是呢大家注意到没有,它的第一句是进行不为空的检查,如果文件为空,则抛出异常,其实吧,这个也好理解,这个文件的核心就是file文件,如果核心都为null了,那么别的就没必要说了
另外呢,我再讲解一个有关工具类的吧
public static String trimLeadingCharacter(String str, char leadingCharacter) {
if (!hasLength(str)) {
return str;
}
StringBuilder sb = new StringBuilder(str);
while (sb.length() > 0 && sb.charAt(0) == leadingCharacter) {
sb.deleteCharAt(0);
}
return sb.toString();
}
在这里呢,我觉得这个StringBuilder写的很好,用它来进行字符串中字符的增减,节能又环保啊,所以我比较推荐在对于字符串中字符的增删的修改中,用StringBuilder或许是一个比较不错的选择
好了,哥们困了,该睡觉觉去了,单身好寂寞呀。。。。。。。。晚安
小辞


分享到:
评论

相关推荐

    python3.0菜鸟教程.zip

    作为初学者,了解并掌握这些基础知识对于学习 Python 3.0 至关重要。以下是一些关键的知识点,它们在 "www.runoob.com" 提供的菜鸟教程中应该有所涵盖: 1. **基础语法**: - **变量与数据类型**:Python 支持整型...

    Spring3.0的新特性

    马士兵老师提供的讲解,对于菜鸟或者是刚学习javaweb和SSH框架的人来说可谓是福音,马老师讲的内容非常详细,同时还会灌输学者一些在实际工作和开发中的一些技巧,特别是代码规范和编程习惯是非常重要的,所以特意...

    python菜鸟3.0-终于清楚python菜鸟入门教程.pdf

    总的来说,Python的学习是一个循序渐进的过程,从环境配置、基础语法学习,到实践操作和解决问题,每一步都是为了更好地掌握这门语言。保持耐心,多动手实践,你将成为一名熟练的Python程序员。

    菜鸟 Spring 源码解读 推荐流程

    在本文中,我们将深入探讨Spring的源码,尤其是针对"菜鸟"级别的开发者如何逐步理解并掌握Spring的核心机制。 首先,源码解读对于任何开发者来说都是提升技术能力的重要途径。通过阅读源码,我们可以更直观地了解...

    struts2+hibernate3.2+spring3.0实现简单的增删改查

    struts2+hibernate3.2+spring3.0实现简单的增删改查

    spring5源码学习

    1. Spring Boot:Spring5与Spring Boot结合,简化项目初始化和配置,源码学习能深入理解自动配置机制。 2. Spring Cloud:在微服务架构中,Spring Cloud提供了服务发现、配置中心、负载均衡等功能,源码分析有助于...

    34--[菜鸟闯关].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码

    34--[菜鸟闯关].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码34--[菜鸟闯关].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码34--[菜鸟闯关].zip源码scratch2.0 3.0编程项目源文件源码案例素材源...

    springcloud简单项目搭建,菜鸟学习

    springcloud简单项目搭建,菜鸟学习Spring Cloud集成相关优质项目推荐 这些项目是Spring Cloud官方项目或是对Spring Cloud进行了有益的补充以及基于Spring Cloud最佳实践。

    spring菜鸟入门经典实例

    本教程专为初学者设计,旨在帮助“菜鸟”快速掌握Spring的基本概念和实战技巧。 在Spring入门阶段,首先要理解的是依赖注入(DI)。DI是一种设计模式,它允许我们解耦组件,让它们之间通过接口而非具体的实现进行...

    菜鸟窝企业项目课程《菜鸟商城》的源码.rar

    通过学习和实践《菜鸟商城》项目,开发者不仅可以掌握Java后端和安卓客户端的开发技术,还能深入了解电商系统的架构设计和业务逻辑,为今后的项目开发积累宝贵经验。同时,该项目也适合初学者进行实战演练,提升自己...

    spring整合redis

    1. **RedisTemplate**: 是Spring Data Redis的核心组件,提供了对Redis操作的基本抽象,如键值操作、哈希操作、列表操作等。 2. **StringRedisTemplate**: 是RedisTemplate的子类,专门处理字符串类型的数据,更...

    深入Python学习:基于菜鸟教程的实战源码解析

    项目概述:深入Python学习实战源码解析 本项目以Python为主要开发语言,基于菜鸟教程的指导,深入探索和实践Python编程。项目包含62个文件,其中38个为...简洁描述:基于菜鸟教程的Python学习实践记录与源码解析集锦。

    仿XP网站源码(PHP200菜鸟)dzx3.0版

    1、controller 控制器 (重要) 2、models 模型 (重要) 3、templates 模板文件(重要) 4、libs smarty库 5、templates_c smarty自动生成的文件 6、JS 常用的JS(当时顺手放的) 7、other 乱78遭的东西,以前学...

    易语言源码易语言菜鸟背包游戏源码.rar

    易语言源码易语言菜鸟背包游戏源码.rar 易语言源码易语言菜鸟背包游戏源码.rar 易语言源码易语言菜鸟背包游戏源码.rar 易语言源码易语言菜鸟背包游戏源码.rar 易语言源码易语言菜鸟背包游戏源码.rar 易语言源码...

    Linux扫盲-Linux菜鸟过关(V3.0)——Linux入门必备

    您不需要任何Linux技能也能阅读本教程,Linux菜鸟过关全面解决您的Linux之旅问题。您现在要做的是了解一些Linux知识与安装方法,按照本教程的顺序阅读即可。本教程可以作为您短期突破Linux安装的教材,这一切都不...

    仿菜鸟商城系统(源码)

    【仿菜鸟商城系统(源码)】是一款专为学习目的设计的电商系统,它提供了从用户界面到后台管理的一整套功能,可以帮助开发者理解和实践电子商务平台的构建过程。该系统模仿了真实的在线购物平台——菜鸟网络,因此在...

    51菜鸟到arm高手

    51菜鸟到arm高手51菜鸟到arm高手51菜鸟到arm高手51菜鸟到arm高手51菜鸟到arm高手51菜鸟到arm高手51菜鸟到arm高手51菜鸟到arm高手

    Spring的源码解析

    对于spring源码的深度解析,适合菜鸟向中级进阶的时候看看

    (3.0版本)自己写的struts2+hibernate+spring实例

    jar包:项目中除了使用了struts2,hibernate3.0和spring1.8以外(用spring2.0的包也可以.不能低于1.8的包.)还是用了junit,ajax,第三方的table组件.等等.所以需要下载相对应的包. 为了上传jar.我专门申请了一个网盘.所有...

    android商城源码(菜鸟商城)

    总的来说,“菜鸟商城”源码是一个功能完备、注释详尽的Android商城应用实例,对于学习Android开发和实际项目经验的积累都有很大帮助。通过深入研究这份源码,开发者不仅可以掌握Android应用开发的基本技能,还能...

Global site tag (gtag.js) - Google Analytics