畅谈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代码”。

posted on 2013-09-12 22:49  Arts&Crafts  阅读(864)  评论(0编辑  收藏  举报

导航