畅谈Spring设计哲学
自己从学习编程开始到现在有一个习惯:一直喜欢把软件开发中的技术和思路放到实际生活中去类比考虑。自己平常也喜欢开一些关于软件哲学的书籍,事实证明这些书籍对自己的学习新技术很有很大的帮助。数学是一切学科的基础,也是一切学科的顶峰,如果有那个学科能超越这个顶峰,我认为是哲学。高中时候一直喜欢看奇幻类的小说,所有小说中的主人公最后都是要领悟"道"的,而这个"道"就是 “哲学”。只有领悟道 自己的 道 后才能创造出自己强大的武技。哲学 讲究的是 道 ,道 是 路 也就是方向的意思。我们只有确定方向了,才能有所成就。
“大道至简”一直是我信奉的一句话:大道理(指基本原理、方法和规律)是极其简单的,简单到一两句话就能说明白,一门技术一门学问,弄得很深奥是因为没有看穿实质,搞的很复杂是因为没有抓住程序的关键。所谓 高人指点一语道破天机,不用太多言语;武术高手在搏击时总是一招制敌,击中要害,绝对不会大战300回合才击倒对手。
被誉为"软件世界的爱迪生",发明了 BSD,TCP/IP, csh, vi 和NFS的 SUN 首席科学家 Bill Joy 说过:在计算机系结构领域中,缓存 是唯一能称得上伟大的思想,其他的一切发明和技术不过是在不同场景下运用这一思想而已。 其实这句话 我觉得 可以运用任何一个领域。里面的 缓存 可以理解为 中间件,代理或者映射。比如 计算机只能识别 0 1,显然这样是无法编程的,于是有了 发明了 “指令集” 把 汇编语言 翻译成 0 1, 这里我们可以把指令集 当做 缓存。汇编语言也很难,于是发明了 高级语言,而计算机无法识别高级语言,于是有了 编译器,编译器 把高级语言翻译成机器可以识别的机器码,这里 编译器 就是 缓存。Java 因为有了JVM 能够模拟机器,所示使它能够快平台。这里的JVM也是一个缓存。其实 缓存的思想 在现实中也是如此,你做不了的事情,你可以通过别人帮你做,此时别人就成了缓存。有时候面对复杂的框架的时候,我们第一直觉就可以把它当做一个缓存,因为这些框架做的事我们都可以做,只是我们现在把我们原本应该做的事让框架帮我们做了,我们试着去想这个框架可以代替我做那些事,我用这个框架可以节省我那些操作,去用它而不是一开始就去研究它。
设计软件犹如设计人生,在我学习Oracle体系结构的时候,让我觉得 Oracle的体系结构 就是一套很好的管理体系,它里面的管理哲学很多都可以在显示生活中借鉴的。一个管理体系无非就是 自上而下 层层递增也就是所谓的 树状结构。
其实面向对象的思想,并不是只属于 面向对象语言,在面向过程的理由也用到这种思想,里面的构件,结构 都可以理解为 对象,其实我们在考虑 任何事物的时候都是把它当做对象(事物)来考虑,所以面向对象的思想不是 OOP语言的 专属。
面向对象 思想里 "万物皆对象" Spring里面 "万物皆Bean"。
Spring遵循的一个宗旨:一切皆为Bean 你可以把 Spring 比作一个 "超级工厂" 里面任何Bean 都可以生产。当然里面的IOC容器 是这个超级工厂的 "核心" 所有从Bean都出自这里,我们只要给了 这个工厂 的 "生产说明" 或者说是 "生产清单" (applicationContext.xml),IOC容器就可以生产处我们想要的 Bean。所谓的AOP(面向切面编程)你可以理解为 "横插一杠",因为 这里的 Bean 是 IOC 容器生产的,所以IOC在生产它的时候可以改变它的行为,比如 一个 Bean A要做 发送邮件这个行为,但是我在 "生产说明" 中规定 这个Bean 在做发送邮件这个行为之前,还有一个Bean L要做记录日志行为,所以当这个Bean要发送邮件的时候,先让L 记录日志,然后才是B发送邮件。其实AOP就是在原有的执行顺序中切入一个新的行为。
或者你可以把Spring 中的 IOC和AOP模块 比作操作系统的 Kernel,对于操作系统的Kernel来说,进度调度器的设计是关键部分,通过进程调度器,一方面 使用 "进程"(比作 Spring中的Bean)这个概念来抽象物理的计算资源,另一方面,可以通过调度算法的设计来实现对计算机资源的高效使用。对Spring来说也是一样的,一方面它通过IOC容器来管理Bean对象,以及它们相互之间的耦合关系,使企业的信息(数据)资源可以用简单的Java语言来抽象和描述;另一方面,可以通过AOP,以动态和非侵入的方式来增强服务的功能。当然 操作系统光有一个 Kernel 是不行的,我们还需要安装显卡驱动,鼠标和键盘驱动等驱动来驱动设备以方便我们的使用,这就好比Spring里面的事务处理,Web MVC, JDBC,ORM远端调用等。
如果还觉得复杂,你就把Spring中的IOC和AOP模块 理解为 CPU及外围设备,其他的理解为 即插即用 设备。
下面两幅图片是从网上找的,介绍Spring框架的
我们也可以这样理解Spring。我们的运用构建于 "超级工厂" 之上,运用里包含很多Spring 生成出来的Bean。
AOP我们通过以下两幅图理解:
本来我们按照正常的顺序执行方法:
下面我在C方法之前切入方法 F:
面向切面就是这么简单。
从本质上来看,Spring容器就是一个“超大型”工厂,Spring容器中的Bean就是该工厂的产品。Spring容器能产生哪些产品,则取决于开发者在配置文件中的配置。
对于开发者来说,开发者使用Spring框架所做的主要两件事:1 开发Bean;2 配置Bean。对于Spring来说,他要做的,就是根据配置文件来创建Bean实例,并调用Bean实例的方法,完成“依赖注入”——这就是IoC的本质。这就要求开发者在使用Spring框架时,眼中看到的“XML配置”,心中想到的是“Jav代码”。
畅谈Spring设计哲学的更多相关文章
- Spring History和spring设计哲学
1.spring history spring起点 2002年10月,Rod Johnson 写了一本名为Expert One-on-One J2EE设计和开发的书.本书由Wrox发布,涵盖了当时Ja ...
- 跟vczh看实例学编译原理——一:Tinymoe的设计哲学
自从<序>胡扯了快一个月之后,终于迎来了正片.之所以系列文章叫<看实例学编译原理>,是因为整个系列会通过带大家一步一步实现Tinymoe的过程,来介绍编译原理的一些知识点. 但 ...
- Python的设计哲学探究
在Python shell中输入import this就会在屏幕上打印出来Python的设计哲学,如下: In [25]: import this The Zen of Python, by Tim ...
- 基于Spring设计并实现RESTful Web Services(转)
基于Spring设计并实现RESTful Web Services 在本教程中,你将会使用Spring来创建一个具有生产力的RESTful网络服务. 为什么用RESTful网络服务? 从和Amazon ...
- Java面向接口编程,低耦合高内聚的设计哲学
接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极大的降低程序中各个模块之间的耦合,提高系统的可维护性以及可扩展性. 因此,很多的软件架构设计理念都倡导"面向接口编程"而 ...
- Python的设计哲学
Beautiful is better than ugly. 优美胜于丑陋 Explicit is better than implicit. 明了胜于晦涩 Simple is better than ...
- 第八课:不一样的链表 linux链表设计哲学 5星级教程
这一课最后实现的链表,和普通链表不同,借鉴了linux内核链表的思想,这也是企业使用的链表. 基础介绍: 顺序表的思考 顺序表的最大问题是插入和删除需要移动大量的元素!如何解决?A:在线性表数据元素之 ...
- React的设计哲学 - 简单之美
React最初来自Facebook内部的广告系统项目,项目实施过程中前端开发遇到了巨大挑战,代码变得越来越臃肿且混乱不堪,难以维护.于是痛定思痛,他们决定抛开很多所谓的“最佳实践”,重新思考前端界面的 ...
- 《Spring设计思想》AOP设计基本原理
0.前言 Spring 提供了AOP(Aspect Oriented Programming) 的支持, 那么,什么是AOP呢?本文将通过一个另外一个角度来诠释AOP的概念,帮助你更好地理解和使用Sp ...
随机推荐
- 网络协议- HTTP
http:是用于www浏览的一个协议.tcp:是机器之间建立连接用的到的一个协议.
- sql服务器内部参数使用详情(存储过程)
exec sp_help;返回当前数据库中的所有存储过程.exec sp_help datebase.dbo.table名称 返回当前表中的所有对象.如字段名称等.这个吊exec sp_helpfil ...
- 初识AM335X
TI 的AM335X,linux 操作系统,全都是陌生的东东,一点一点来熟悉吧. 拿的TI代理的一开发板,直接看文档.环境由于之前一同事已经装好了,公司条件受限,没法让我们一人一台ubuntu的机子来 ...
- android控件上面实现提醒信息
android开发中,经常会用到显示一个提醒信息,比如个人中心,有新信息,购买商品后,在购物车控件,显示购物数量等.我们可以用,2个控件来实现,或者用层叠图. 还有一种简单方便的办法,使用别人的开源代 ...
- 整理Git的命令使用
Git是一个开源的分布式版本号控制系统,用以有效.快速的处理从非常小到非常大的项目版本号管理.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源代码的版本号 ...
- Reso | Noise 网易云音乐插件
源码地址:https://github.com/Simpleyyt/noise-neteasemusic安装方法:sudo add-apt-repository ppa:simpleyyt/ppasu ...
- iOS 10 个实用小技巧(总有你不知道的和你会用到的)
在开发过程中我们总会遇到各种各样的小问题,有些小问题并不是十分容易解决.在此我就总结一下,我在开发中遇到的各种小问题,以及我的解决方法.比较普遍的我就不再提了,这里主要讲一些你可能不知道的(当然,也有 ...
- linux服务器上的php代码通过nginx发布,解决pathinfo模式问题
附件1为修改前的正常访问php配置文件 附件2为修改后的能通过url地址访问php项目的配置文件 具体操作网址 如下:www.itokit.com/2012/0308/73275.ht ...
- php include 与 require 起底[转]
转自 http://www.guangla.com/post/2014-01-24/40060857811 起因: 一朋友面试被问到,php的include和require的区别,这个可能是面试中出现 ...
- HDU 4607 Park Visit(树的直径)
题目大意:给定一棵树,让求出依次访问k个点的最小花费,每条边的权值都为1. 思路:如果能一直往下走不回来,那么这个路径肯定是最小的,这就取决于给定的k,但是怎么确定这个能一直走的长度呢,其实这个就是树 ...