疯子在思考之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 包,里边有具体实现。
关于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 写道谭浩强说过这样一句话:“程序=算法+数据结构”
-----------------
当心挨揍
你什么意思?为什么挨揍?