zoukankan      html  css  js  c++  java
  • 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代码”。

    全文转载自:https://www.cnblogs.com/ArtsCrafts/p/Spring.html

  • 相关阅读:
    Redis源码分析(二十一)--- anet网络通信的封装
    leetcode 总结part1
    leetcode String to Integer (atoi)
    leetcode 165. Compare Version Numbers
    leetcode 189. Rotate Array
    leetcode 168. Excel Sheet Column Title
    leetcode 155. Min Stack
    leetcode 228. Summary Ranges
    leetcode 204. Count Primes
    leetcode 6. ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/April315/p/10666696.html
Copyright © 2011-2022 走看看