Struts2技术内幕 读书笔记一 框架的本质
本读书笔记系列,主要针对陆舟所著<<Struts2技术内幕 深入解析Strtus2架构设计与实现原理>>一书。笔记中所用的图片若无特殊说明,就都取自书中,特此声明。
什么是框架?我们为什么要用框架?框架能给我们带来什么?
这几个问题既简单又复杂。说它简单,是因为框架确实存在在软件设计中,说它复杂是因为我们现在所使用的框架不论是spring还是struts都是经过多年的发展,其内部已经十分庞杂了,因此想一句话两句话说清楚一个框架就不是那么简单了。
OK,既然现有的框架都很复杂,那我们就找一个简单的:
if(str==null || str.length()==0){ //...你的逻辑 }
上面这段代码,无论是语法还是功能都很简单:判断一个字符串是否为空。
我们仔细回想一下,我们所写的java代码首先就得得到java的语法支持和基本功能的api支持(例如上面的str.length()就是返回字符串的长度)。再换句话说我们所写的代码都依赖一个最最基本的条件:
jdk所提供的api支持***
如果一个需求被重复1000次,那么我们就需要重复1000次针对需求的解决方法。如果一个项目里我们有1000个地方都需要判断字符串是否为空,当然上面的代码完全可以,不过我们是不是能够对它做一点点重构呢?
public abstract class StringUtils{ public static boolean isEmpty(String str){ return str.length()==0 || str==null; } }
在我们的代码里要使用上面的功能,代码如下:
if(StringUtils.isEmpty(str)){ //...你的逻辑 }
我们对代码做了一次小小的改进,可就是这个改进,让我们的代码有了两个良好的品质:
1 可读性
只要是学过英语的朋友,应该都知道empty的意思吧。对"判断字符串是否为空"这个功能点,我们抽象出一个方法,名字就叫做isEmpty,不就是见名知义吗?相信一些有经验的程序员看到isEmpty的方法名就能想到内部的实现过程。我们再看看未重构前的代码,如果在一个七八百行的代码片段里,我们最初写的那部分代码是不能引起我们思维的停顿的。而后者作为一个提炼出来的方法,可以给我们一个直观的提示。
2 可扩展性
这个就更简单了,如果对"判断字符串是否为空"这个功能点做一下改变,之前的方法需要改1000次,而抽取出逻辑合成一个新的方法就只需要改一次。
其实上面的问题,很多计算机前辈都已经预见到了,在Apache的common-lang.jar里面就有类似的代码。如果我们想使用Apache的功能扩展,只需要将上面的那个jar包加到CLASSPATH中即可。
上面的道理很简单,大家都干过,但就是这个简单的例子,告诉了我们一个深刻的道理:
每当我们把一个jar包加入CLASSPATH中,就等于获得了jar中所有对jdk的额外支持。
我们所有的程序,其内在结构如下:
最底层的就是jvm,它提供了java程序运行的基础环境;再之上就是jdk,它是构建在jvm上的基本的对象行为的定义。再之上就是jar包层次,通过上图大家也能看到,jar包层次里面似乎是一块一块的砖头,它们间是可区分的,但是这些砖头合在一起构成一层,为最上层的我们写的应用程序服务。
看eclipse里面CLASSPATH的截图,我们可以看到我们所熟悉的框架都是以一个一个的jar包的形式被加载到程序运行所依赖的CLASSPATH中的。
因而我们又可以得出一个结论:
框架只是一个jar包而已,其本质是对jdk的功能扩展。
那么我们为什么要把jar包加入CLASSPATH呢?回想我们最开始说的字符串判空,我们的初衷就是:
解决中某个领域的开发中遇到的困境。
因而,框架存在的意义:
是在某个领域内,解决问题。
所以,对我们程序员来说,千万不要为了学框架而学框架,我们应该抱着为了解决某些问题的态度来学习框架。
这篇只是一个预热,下面我们再谈谈web开发的一些"基础知识"。
Struts2技术内幕 读书笔记一 框架的本质的更多相关文章
- Struts2技术内幕 读书笔记三 表示层的困惑
表示层能有什么疑惑?很简单,我们暂时忘记所有的框架,就写一个注册的servlet来看看. index.jsp <form id="form1" name="form ...
- Struts2技术内幕 读书笔记二 web开发的基本模式
最佳实践 在讨论基本模式之前,我们先说说一个词:最佳实践 任何程序的编写都得遵循一个特定的规范.这种规范有约定俗称的例如:包名全小写,类名每个单词第一个字母大写等等等等;另外还有一些需要我们严格遵守的 ...
- 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口
Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...
- Kafka技术内幕 读书笔记之(一) Kafka入门
在0.10版本之前, Kafka仅仅作为一个消息系统,主要用来解决应用解耦. 异步消息 . 流量削峰等问题. 在0.10版本之后, Kafka提供了连接器与流处理的能力,它也从分布式的消息系统逐渐成为 ...
- webkit技术内幕读书笔记 (一)
本文部分摘录自互联网. Chromeium与Chrome Chromium是Google为发展自家的浏览器Google Chrome而打开的项目,所以Chromium相当于Google Chrome的 ...
- MySQL技术内幕读书笔记(八)——事务
事务的实现 事务隔离性由锁来实现.原子性.一致性.持久性通过数据库的redo log和undo log来完成.redo log称为重做日志,用来保证事务的原子性和持久性.undo log用来保证事 ...
- MySQL技术内幕读书笔记(七)——锁
锁 锁是数据库系统区分与文件系统的一个关键特性.为了保证数据一致性,必须有锁的介入.数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性. lock与latch 使用命令 ...
- MySQL技术内幕读书笔记(六)——索引与算法之全文索引
全文索引 概述 通过索引字段的前缀进行查找,B+树索引是支持的,利用B+树索引就可以进行快速查询. SELECT * FROM blog WHERE content like 'xxx%'; ...
- MySQL技术内幕读书笔记(二)——InnoDB存储引擎
目录 InnoDB存储引擎 InnoDB存储架构 Checkpoint技术 Master Thread 工作方式 InnoDB关键特性(放一下,感觉看后面,再看总结吧) InnoDB存储引擎 Inno ...
随机推荐
- [ExtJS5学习笔记]第三十一节 sencha extjs 5使用cmd生成的工程部署到tomcat服务器
本文地址:http://blog.csdn.net/sushengmiyan/article/details/42940883 本文作者:sushengmiyan ------------------ ...
- FORM执行查询的各种方法
一.FORM调用FORM后执行查询 1.打开 APPSTAND.fmb,把 Object Groups 下的 QUERY_FIND 对象组拖动到自己的 form 中的 Object Groups ...
- iOS日历中给一个事件添加多个提醒
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) iOS自带的日历应用中,我们最多只能给一个事件设置2个提醒,但 ...
- (NO.00005)iOS实现炸弹人游戏(八):游戏主角(一)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近一直在做另一个RPG游戏,所以本系列迟迟没有更新,上一篇博 ...
- C++对C的实用性增强
#include <iostream> using namespace std; //C语言中的变量都必须在作用域开始的位置定义!! //C++中更强调语言的"实用性" ...
- Spark技术内幕:Worker源码与架构解析
首先通过一张Spark的架构图来了解Worker在Spark中的作用和地位: Worker所起的作用有以下几个: 1. 接受Master的指令,启动或者杀掉Executor 2. 接受Master的指 ...
- Android简易实战教程--第一话《最简单的计算器》
转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51707931 从今天开始,本专栏持续更新Android简易实战类博客文章.和以往专 ...
- Cocos2D iOS之旅:如何写一个敲地鼠游戏(六):放置地鼠
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- Hash冲突解决
hash的冲突不可避免的 1.开放地址法 开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,-,k(k<=m-1) 其中,m为哈希表的表长.di 是产生冲突的时候的增量 ...
- Java进阶(六)Java反射机制可恶问题NoSuchFieldException
作为一种重要特性,Java反射机制在很多地方会用到.在此做一小结,供朋友们参考. 首先从一个问题开始着手. 可恶的问题又来了,NoSuchFieldException,如下图所示: 完全不知道这个qu ...