深入浅出Spring IOC原理

     (如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力。本博客会逐步推出一系列的关于大型网站架构、分布式应用、设计模式、架构模式等方面的系列文章)

  学过Spring的应该知道,spring的核心就是ioc和aop了。今天来说一下ioc到底是什么,原理是什么,主要解决了哪些问题。

 

考虑以下情形:

  (1) 自己到报摊买报纸好?还是在邮局订阅,让人给送来好?

  (2) 老板亲自去人才市场选拔、任命销售人员好?还是老板直接下达命令,让人事部处理更好?

 

IOC拟物化
  说到网购,其实,淘宝网就是很大的ioc容器,你要的东西应有尽有,店家把各自的东西挂到上面,就相当于把Bean放入容器的过程,而我们搜索我们想要的东西的过程,就类似于ioc注入的过程,找到了也就是注入成功了,找不到就抛出异常。意思就是:只要满足我们的条件,哪家卖的都无所谓。言外之意,反应到ioc中就是:只要实现的接口,具体注入哪个实现类都是无关紧要的。

IOC概念
  ioc是控制反转。从字面意义上理解,控制反转就是反过来控制。以前我们需要一个对象,都需要自己去new出来这个对象,控制反转之后,也就是说我们不需要主动自己去new这个对象,我们只要直接去接受这个对象就行了,换句话说这个对象被注入进来了,这就是DI的概念。

IOC原理
  IOC的最大作用就是bean管理和解耦。到底是如何进行解耦的呢?下面我用数学中的有向图进行说明。我们可以把Spring管理的每一个Bean当做一个节点(假设有N个Bean,那么就有N个节点),于是这些Bean加上相互之间表示调用关系的有向边就组成了一个有向图。毫无疑问,有向图的边越多那么平均来说每个顶点之间的耦合度就越大,最大的情况为完全有向图,即任何两个节点之间都有两条有向边,此时每个顶点的度为2(N-1),也就是说每个Bean与其他的N-1个Bean有耦合,而且还是双向耦合。如下图所示:

    

  在编程的时候,我们都是本着高内聚、低耦合的编程方式,但是我们知道,要想达到完全的没有耦合是不可能的。所以能做的就是尽最大可能的保证松耦合。如何能减少类与类直接的耦合呢?一般我们都是用接口来实现。通过让类与类之间,依赖于接口,而不依赖于类,来达到松耦合的目的。但是无论耦合多么“松散”,具体的实现类还是需要new出来的,于是就得考虑这个new的过程应该放在哪里才是最合适的。如果在每个Bean中都去new这个Bean需要的其他Bean,那么耦合的程度又回到了上图的情况,那是没有意义的。所以我们就需要找一个中间人,在中间人那里实现new的过程,然后把new好的实例传递给需要这个实例的对象,这样的话一切问题就迎刃而解了。因此spring ioc容器就借助这个原理实现了bean管理和松耦合的功能。如下图所示:

  

  上图也就是Spring的数学描述,图中很清晰的表明了在使用Spring之后,任意两个节点(Bean)之间的有向线段变成了0(确切的说不完全是0,因为任意两个节点之间还是可以通过容器连接的),唯一和这些Bean有关系的是容器(无论谁需要什么东西都去找容器,尽量避免两个Bean之间直接打交道)也正因为如此Spring才达到了解耦的目的。

posted on 2016-02-22 14:02  快跑的小鸡  阅读(562)  评论(1)    收藏  举报

导航