疯子在思忖之IOC

疯子在思考之IOC
控制反转 英语:Inversion of control,缩写为IoC
我想很多同学都会思考过这样的一个问题,控制反转,什么地方反转了,是不是翻译的不对?
这里插一句
当年马云借着盖茨的嘴说:“互联网会改变世界。”其实是他自己说的,因为那时侯没有人认识马云,如果我说是翻译错误,大家肯定拍砖说我没理解。
大家对spring都用了很多年,有喜欢看书的同学一定会看到过spring 技术内幕,非常棒的一本书,没看的看过这篇博客之后记得买一本。
细心的同学可能会记得这样一句话

早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”这个问题。他总结出是依赖对象的获得被反转了。基于这个结论,他为控制反转创造了一个更好的名字:依赖注入。--摘自*
其实他真的翻译的不够友好,所以后来才有了依赖注入(Dependency Injection,简称DI)。其实他们说的是一个意思。


bean的历史及工场模式:
最原始的bean是直接new出来的,后来出来了工场,把所有的bean放到工厂里统一生产,但还是写new,只不过这个new放在一个方法里了。再后来就是依赖注入帮了我们大忙,我们看不见new了。其实spring ioc就是一个大工厂 BeanFactory

有好多同学说过接口有什么用?我不用接口一样写代码,我不用spring一样new.

OOP的三个特性是封闭继承和多态,三个特性,继承和多态就占了两个,学java的人都应该看think in java。里面也强调了代码复用的三个方式是组合,继承和代理。这六点其实非常重要。
think in java引入过一个名词叫做"客户端程序员",其实我们所有应用框架的人都是客户端程序员,那么框架的设计的要想到可扩展性和代码的复用性以及兼容性。想想spring就很容易理解,这些都需要接口。

  有接口就会有多态,有多态就需要修改new后边的代码,如果这些写到代码里,很多的话,重构就会带来问题。这是第一点;其二通过ioc可以实现bean的统一管理,很方便,对bean的依赖关系一目了然,很容易把握全局,利于分析。所以ioc确实是非常有用的,是很棒的思想。


从字面上理解,两个词,一个是依赖一个是注入。
谭浩强说过这样一句话:“程序=算法+数据结构”
所以分析Ioc我们从数据结构入手。它实际上有一个beanDefinition 的定义类,要实现注入首先我们要知道某个bean 的class及这个class的依赖关系,然后通过递归进行实例化并注入。
大家都知道spring的bean有两种形式,singleton及prototype
其实了解这些思想之后我们很容易想到其实就是通过对xml的解释来实生成bean的过程,如果是singleton那么我们直接缓存bean.如果是protoype我们缓存class.
所以归结起来最核心的功能就是对xml的解析及递归调用的算法,感兴趣的同学可以参考我框架中的ioc 包,里边有具体实现。
1 楼 lvwenwen 23 小时前  
疯子在思考之IOC
2 楼 孤独的CPU 14 小时前  
说的很笼统,也仅仅是思考下。
3 楼 zh_harry 14 小时前  
孤独的CPU 写道
说的很笼统,也仅仅是思考下。

这已经很详细了,具体的有代码,我框架里有,就不在这帖了,有兴趣的可以去下代码,看一下。
4 楼 liangcoder 14 小时前  
IOC是一种依赖解耦的模式,反转的是依赖方向。建议阅读
http://www.amazon.cn/%E6%95%8F%E6%8D%B7%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91-%E9%A9%AC%E4%B8%81/dp/B00116MMA8/ref=cm_cr_pr_product_top
5 楼 zh_harry 13 小时前  
liangcoder 写道
IOC是一种依赖解耦的模式,反转的是依赖方向。建议阅读
http://www.amazon.cn/%E6%95%8F%E6%8D%B7%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91-%E9%A9%AC%E4%B8%81/dp/B00116MMA8/ref=cm_cr_pr_product_top

谢谢,您想表达什么呢?
6 楼 孤独的CPU 13 小时前  
zh_harry 写道
孤独的CPU 写道
说的很笼统,也仅仅是思考下。

这已经很详细了,具体的有代码,我框架里有,就不在这帖了,有兴趣的可以去下代码,看一下。

会去的,我现在也在考虑看开源框架的源代码。正好可以研究。
7 楼 zh_harry 11 小时前  
zh_harry 写道
liangcoder 写道
IOC是一种依赖解耦的模式,反转的是依赖方向。建议阅读
http://www.amazon.cn/%E6%95%8F%E6%8D%B7%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91-%E9%A9%AC%E4%B8%81/dp/B00116MMA8/ref=cm_cr_pr_product_top

谢谢,您想表达什么呢?

请仔细看看我的博,里边从根源上告诉你什么是ioc.然后有兴趣再看看我的代码。谢谢关注。
8 楼 dongmingbin 11 小时前  
代码看过,没找到容器启动的地方。。。疯子在思忖之IOC
9 楼 zh_harry 11 小时前  
dongmingbin 写道
代码看过,没找到容器启动的地方。。。疯子在思忖之IOC

关于ioc部分可以看ioc包下的beanfactory
容器启动的部分我抽空会写demo
请关注,谢谢
10 楼 zh_harry 10 小时前  
感觉好多网友没有搞懂我在表达什么?我在这里补充一下。
1.ioc名字的由来,我要表达是翻译有歧义,依赖注入更好理解,他们说的是一个意思。文中是有依据的。
2.ioc的实现实质是工厂模式,看过代码的人都应该理解。
3.要表达为什么要用ioc好处是什么?这里说的好处好像不全,有熟的同学可以补充。
4.里边穿插些基础理论,这也是我本人思考问题的方式吧,比较注重基础。我认为基础就是核心。
5我要说不要被别人的所说的蒙蔽,要有独立思考意识或者说能力。
接下来我会写mvc.及关于学习的等一系列的思考文章,会更有独到的思考模式和见解,请大家关注拍砖。
11 楼 hardPass 9 小时前  
肤浅    
12 楼 zh_harry 8 小时前  
学习和做人一样要着地,才不至于漂,文章要照顾所有网友,尽量简单容易理解。如果你觉得自己很牛了,请说出肤浅的理由,大家讨论。谢谢
13 楼 robert.wei 1 小时前  
很多人都只知道怎么去使用SPRING, 其实了解些背景或看看主要的用例也就这样。

至于是依赖注入,还是控制反转, 个人觉得都合适,看个人的理解。
spring引入有一个非常合适的比喻:“在没有spring之前,我们去酒吧,啤酒、小吃、爆米花,都要我们自己去拿,自己去new;  spring出现之后, spring就扮演了酒吧服务员的角色,你要啤酒、小吃、爆米花不用你去拿,自己去new, 你只要告诉spring,给我来啤酒,它就帮你把啤酒拿来了....”


<<spring技术内幕》我没去看, 不过我看了《spring揭秘》,感觉非常的好!
14 楼 zh_harry 23 分钟前  
robert.wei 写道
很多人都只知道怎么去使用SPRING, 其实了解些背景或看看主要的用例也就这样。

至于是依赖注入,还是控制反转, 个人觉得都合适,看个人的理解。
spring引入有一个非常合适的比喻:“在没有spring之前,我们去酒吧,啤酒、小吃、爆米花,都要我们自己去拿,自己去new;  spring出现之后, spring就扮演了酒吧服务员的角色,你要啤酒、小吃、爆米花不用你去拿,自己去new, 你只要告诉spring,给我来啤酒,它就帮你把啤酒拿来了....”


<<spring技术内幕》我没去看, 不过我看了《spring揭秘》,感觉非常的好!
其实是一个意思,哪个都合适。有些人非要拿这个东西来绕,本来就是很简单的事情。思考问题要把复杂问题简单化,而不是把简单问题复杂化。
15 楼 truekbcl 19 分钟前  
谭浩强说过这样一句话:“程序=算法+数据结构”
-----------------
当心挨揍
16 楼 zh_harry 16 分钟前  
truekbcl 写道
谭浩强说过这样一句话:“程序=算法+数据结构”
-----------------
当心挨揍

你什么意思?为什么挨揍?