谈一谈框架的框架——Spring

一直想用一个什么样的词来形容Spring合适,这里会有很多候选词,比如粘合剂(Spring可以很好的把其他框架整合起来,这样感觉粘合剂比较贴切,但同时这会给人一种强依赖的感觉,这与Spring的初衷——解耦是相悖的,所以pass再见)、构造器(J2EE的项目中很少有不用Spring的,这就给人一个错觉,就是Spring是其他框架的基础,没有它其他框架就不能用,其实我们看一看主流的框架,比如mybatis、Struts、hibernate,这些框架都有很详细的使用说明,里面并没有说和Spring的依赖关系,也就无从说谁是谁的基础),然后我想到了框架这个词,既然普通的项目可以有框架,为什么框架不能有框架呢,有了这样的认识,很多问题就很容易解释了。比如上面的错觉,这和我们可以使用jdbc完成数据库的相关操作,但ORM框架可以让我们更方便的完成同样的事情,而且代码清晰,更好维护是一样的道理。Spring不是我们使用其他框架的基础,但他可以让我们更好的使用其他框架。如果看到这里你可以会心一笑了,那么也就不用再看我下面的啰嗦了,当然,好学的同学一定会问,你这只是打了一个比方,还未涉及根本,那么接下来我们就从根源上说一说,提到根源,就不得不提到Spring的两大核心,即IOC和AOP。这两个核心有同一个思想,那就是解耦。解耦可以让各个模块独立出来,相互之间没有依赖关系,这样各个模块可以只关注自己的核心业务,做自己擅长的事,这样也就产生了各种MVC、ORM、RPC框架。但这样也就产生了另一个问题,你们都去关心自己的核心业务去了,那么谁来把它们整合在一起呢,没错,还是Spring,只要你符合我的IOC或AOP设计,我就可以把你整合进来。到这里也就基本解释了所谓框架的框架。

上面说了很多虚的,接下来我们再聊一些实的。

 The Spring Framework is a lightweight solution and a potential one-stop-shop forbuilding your enterprise-ready applications。这是Spring官方文档的第一句话,大概意思是说,Spring框架是一个轻量级的解决方案和一个企业级应用的一站式商店。我这边理解Spring大概是想表达两个意思,一个是Spring是一个轻量级框架,没有太多的依赖;另一个意思是说Spring可以提供一站式服务,你想要的都可以从我这里取。总的意思也就是:Spring框架既好用(简单)又好用(强大)大笑。第一句就开始了王婆卖瓜的模式,那么接下来会是什么的,接下来我们看到了Spring对IOC的解释,在这么显著的位置做出一个说明,从这里可以看出Spring做技术的严谨,另一方面也说明IOC确实难以理解尴尬。 下面是原文的截图


这里面前两段描述了构造一个应用所面对的问题,也就是所谓的痛点,然后重点提出Spring IOC是这类问题的一个很好的解决方案,而且已经有很多组织这么做了,潜台词也就是你为什么不用呢大笑。好不容易看完了,才发现这解释基本就是没解释嘛尴尬,文档的编辑者显然也意识到了这个问题,然后又在下面的小字里面引用了Martin Fowler的博客,然后点进去看看都写了什么,文章很长,但第一段基本也就概况了全篇,然后我再摘取其中的关键句——this article I dig into how this patternIOC works, under the more specific name of "Dependency Injection", and contrast it with the Service Locator alternative. 文章提出了另一个名词——Dependency Injection也就是依赖注入。当然主要的概括句是第一句,指出这篇文章的意图是说明如何实现IOC这种设计模式的,注意想要看名词解释的同学又要失望了,这里依然没有解释大哭,然后请允许我忽略最后一句提到的Service Locator因为这是另一种设计模式,而且依然不容易理解,好在并不常用偷笑,所以为了不把大家带到坑里,这里也就不再多说了。文章后面通过一些简单明了的例子,介绍了IOC的实现方式,然后归类为三种方式,分别是接口注入(Interface Injection)、构造注入(Constructor Injection)和set注入(Setter Injection)。然后对不同的注入方法做了对比,至此文章相关的内容也就基本结束了。一定有很多同学也像我一样仍然对IOC的概念很是好奇,但无论是Spring的官方说明,还是作者的博客都做了很大篇幅的说明,却始终没有一个明确的概念解释,那么我们可以做出两个推测,一个是他们认为IOC作为一种设计模式,大家都应该知道的,没必要解释的;另一个推测是IOC这种设计模式本身就是很抽象的,如果给出明确的解释反而限制了它。也就是说每个人都可以有自己的理解,如果还是理解不了,大家还可以看一下百度百科。当然能够耐心看的这里的同学,怎么可以被这么着敷衍过去呢,既然说每个人都可以有自己的理解,那么我就分享一下我的理解。IOC(Inversion of Control):字面意思是控制反转,然后我们拆开来讲,控制什么,服务或者说接口的实现;为什么说反转,一般的概念服务的控制权是在服务的提供者,反转说的是把服务的控制权交给服务的使用者,由使用者告诉提供者我需要怎样的服务。

然后我们继续撸这份官方的说明文档,前面既然做了答疑,下面也就不再啰嗦,直接进入主题,说他抛出一张图


也就是Spring的组件图,按大的组件分为CoreContainer、AOP and Instrumentation、Messaging、Data Access/Integration、Web、Test这几类,再细分的话,CoreContainer又包括Beans、Core、Context、SpEL;DataAccess/Integration包括JDBC、ORM、OXM、JMS、Transactions;Web包括Websocket、Servlet、Web、Portlet。然后不同的组件Spring又分别打成了一个或多个jar包,大家可以通过maven去管理这些jar包依赖。文档后面还对maven的依赖配置做了说明。总的来说Spring的说明文档还是很详尽的,无论是作为使用手册,或者加深对Spring的理解,都是很有必要读的。

文章用了很大篇幅去说明IOC,却有意无意的忽略了另一个核心——AOP,我想这个的原因应该是基于我上面提的第一种推测,所以这里我也就不再赘述。最后,IOC和AOP是两种设计模式,不止Spring实现了,其他框架,比如JBoss、EJB,也都有实现,接下来如果有时间的话,我再详细说明这两种设计模式在Spring的实现,敬请期待再见

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值