负责的说,我没有用过Spring,更没有看过它的源码,只是和饼子堂的朋友聊了聊,但是我觉得我已经明白Spring的IoC了(早年也试图看过几本Spring相关的书,往往是浅尝辄止了,多亏这几次聊天了)。不过这样讲,很让人恼火,不过我觉得我确实知道Spring的内部是如何实现的了,今天先把它们写出来(我以为我知道了,但是题目还是 猜想)。
另外,前几天,我在JavaEye上,见到了一篇关于Spring的帖子,大致也是讲原理的,因为那个时候我就打算写这篇blog了,于是我没有敢看,因为我怕,怕文章颠覆了我的想法,真是掩耳盗铃啊。等我写完了,我会仔细阅读以下的。
Spring
Spring的IoC,(我以为)其最大的作用就是解耦,在实际的应用中,使得各个组件之间保持松散。当然了,我显然不讲使用,而是讲原理。
首先,先看下面的代码:
IA是一个接口,A实现了该接口,当我们要使用A(作为IA实现)的功能的时候,最初的Java代码要这样写。
这样,无疑使得调用方依赖于实现方了。
而我们知道,依赖往往是不好的。如果调用方不知道实现class是A,那么就更好了。那么可以大致这样写。
这里,我还是把一些看起来是Spring的代码列出来吧,毕竟我的目的是让人清楚Spring做了什么,已经它是怎么做到的。
现在,我们发现,调用方不依赖于A了,而耦合的仅仅是一个字符串“A”了。那么,这就非常好了。我实在想不出来还有比这更小的耦合方式,除非是习惯胜于配置学说至上者。
那么这背后都需要做点什么呢,其实很简单,Spring所以号称是容器(当然了,不是Servlet容器),是因为它确实有容量~,它通过查找对象的配置项,把书写在Xml配置文件中的class,通过反射的方法创建出来,并按照<string, object>的方式,用一个HashMap进行键值对存储起来。实际上,它存储的可能不是需要的对象,而是这个对象的Factory,因为这样有利于Lazy-Loading吧?
其实,IoC部分,就这么简单:调用方依赖Spring,而不是直接依赖于实现方;而Spring去通过配置文件,完成wiring,实现调用和实现直接的间接联系。
想到Ferry了,其实也是使用了这种手法,只是Ferry关注更多的是对象之间解耦和通信,并且强调一对多的联系。
好了,让我去搜搜那篇帖子吧。建议各位看这篇,而不是我这篇(显然我的篇幅很短)。
http://www.javaeye.com/topic/493965
可能是这篇。
本文出处:http://www.cnblogs.com/healerkx/articles/1597614.html