我有个疑惑,就是既然我们可以通过 new 的方式去创建对象,而且也方便也好理解。为什么还要Spring的IoC/DI呢?Spring到底给我们带来了哪些好处呢?这两者有什么区别呢?希望能帮我解决下这个问题……谢谢!
有个故事说的挺好的!
所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。
那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转
new 就是现实创建指定类型的实例,用其他的任何类型坚决没门,放置这个对象的控制权交换一下,得到灵活性,可以是某个类型下任意一个实现类型...
可以参考
[url]http://jinnianshilongnian.iteye.com/blog/1471944[/url]
[url]http://www.iteye.com/topic/1122835[/url]
一句话 就是用到时已经给你准备好了,并且是统一管理的,比你用时再建,再用时再见无论从效率还是复用都高,而且还能解耦合。谁用谁知道O(∩_∩)O
简单的说,没有没有IOC/DI之前,你的程序就是个屌丝,渴了自己打水,饿了自己做饭,有了没有IOC/DI之后,你的程序就变成高富帅了,有人替你端茶递水,有人给你洗衣做饭,你就可以衣来伸手饭来张口了,
你去饭馆吃饭的时候,如果还要你自带盘子和碗,你愿意不,虽然,盘子和碗很便宜,呵呵
用接口以后才能体现出来好处,否则和自己new还真没啥区别
对象的组装,之间的关联交给容器关联
我们只定义他们的关联,通过xml或annotion
IOC我的理解就是面向接口的编程。
举个例子,你在main方法里要运用一个磁盘传输数据的方法:
磁盘 a=new 磁盘();
但是如果现在要求你使用U盘来实现传输数据的功能怎么办?
U盘 u=new U盘();?
这就导致对于底层的过度依赖,java思想是下层为上层服务,不是上层依赖下层。
所以就必须使用接口的方式,使得磁盘和U盘同时实现设备这个接口里的方法。接口 i=new 磁盘()或者new U盘();
因为java的对象是在运行期才会被创建的,而非编译器。但是这样仍然存在着问题,就是每次要改动对象类型的时候还是要到程序里去做修改,如果有了xml文件的话,可以直接修改xml文件。
所以这就是IOC的大致思想。
控制反转的意思就是将底层对程序拥有的控制权转移给了接口!!!实现了接口控制的方式!
当然这只是他的核心思想,IOC里面还有其他的东西值得继续研究。
不知道你现在明白了吗?