`
zh_harry
  • 浏览: 102455 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
877aca81-daac-33c8-8bf9-3a886cebc6c3
自己动手写java 框架
浏览量:28410
社区版块
存档分类
最新评论

疯子在思考之IOC

    博客分类:
  • JAVA
阅读更多
控制反转 英语: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 包,里边有具体实现。
6
12
分享到:
评论
20 楼 zh_harry 2013-07-22  
看了有些回复,只能说现在的有些年轻人太浮躁了
19 楼 zh_harry 2013-07-22  
Motte2010 写道
接口,只是说提倡使用接口变成的模式,并不是说你随便开发一个东西就需要用到接口。
如果你是需要为公司研发一套核心的框架,你可以考虑接口和各种设计模式;但是很多实际应用的开发中,很多人都是创建一个Service的时候加上一个接口,一般的时候,这个接口却只为一个类服务,这样的使用接口只会让系统越来越庞大,复杂,还不如直接使用实现类。
你写的IOC,没见哪里有你说的详细,笼统,看了等于没看,当然,一个IOC也不是一篇简单的博客,几行代码就能搞定的事。spring技术内幕中,是花了大量的篇幅。。。
个人意见而已,不是抨击。。。我也在学习。。。

抨不抨击没关系了,我想要表达的东西就是抓住最核心的概念,用最简单的方法来实现。 spring的ioc肯定是一个很大的东西,但最核心的东西能在这说说是什么?再回过头来看看这篇文章相信你会有所收获。
18 楼 Motte2010 2013-07-22  
接口,只是说提倡使用接口变成的模式,并不是说你随便开发一个东西就需要用到接口。
如果你是需要为公司研发一套核心的框架,你可以考虑接口和各种设计模式;但是很多实际应用的开发中,很多人都是创建一个Service的时候加上一个接口,一般的时候,这个接口却只为一个类服务,这样的使用接口只会让系统越来越庞大,复杂,还不如直接使用实现类。
你写的IOC,没见哪里有你说的详细,笼统,看了等于没看,当然,一个IOC也不是一篇简单的博客,几行代码就能搞定的事。spring技术内幕中,是花了大量的篇幅。。。
个人意见而已,不是抨击。。。我也在学习。。。
17 楼 zh_harry 2013-07-22  
truekbcl 写道
谭浩强说过这样一句话:“程序=算法+数据结构”
-----------------
当心挨揍

“数据结构十算法= 程序”这一著名公式。提出这一公式并以此作为其一本专著的书名的瑞士计算机科学家尼克劳斯·沃思(Niklaus Wirth)由于发明了多种影响深远的程序设计语言,并提出结构化程序设计这一革命性概念而获得了1984年的图灵奖。他是至今惟一获此殊荣的瑞士学者。

由于第一本是谭浩强的C语言,受其影响比较深,其实这句话确实不是谭浩强说的,谢谢truekbcl 同学。帮我纠正了一个大错误,在此我道谦!
16 楼 zh_harry 2013-07-22  
truekbcl 写道
谭浩强说过这样一句话:“程序=算法+数据结构”
-----------------
当心挨揍

你什么意思?为什么挨揍?
15 楼 truekbcl 2013-07-22  
谭浩强说过这样一句话:“程序=算法+数据结构”
-----------------
当心挨揍
14 楼 zh_harry 2013-07-22  
robert.wei 写道
很多人都只知道怎么去使用SPRING, 其实了解些背景或看看主要的用例也就这样。

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


<<spring技术内幕》我没去看, 不过我看了《spring揭秘》,感觉非常的好!
其实是一个意思,哪个都合适。有些人非要拿这个东西来绕,本来就是很简单的事情。思考问题要把复杂问题简单化,而不是把简单问题复杂化。
13 楼 robert.wei 2013-07-22  
很多人都只知道怎么去使用SPRING, 其实了解些背景或看看主要的用例也就这样。

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


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

关于ioc部分可以看ioc包下的beanfactory
容器启动的部分我抽空会写demo
请关注,谢谢
8 楼 dongmingbin 2013-07-21  
代码看过,没找到容器启动的地方。。。
7 楼 zh_harry 2013-07-21  
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.然后有兴趣再看看我的代码。谢谢关注。
6 楼 孤独的CPU 2013-07-21  
zh_harry 写道
孤独的CPU 写道
说的很笼统,也仅仅是思考下。

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

会去的,我现在也在考虑看开源框架的源代码。正好可以研究。
5 楼 zh_harry 2013-07-21  
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

谢谢,您想表达什么呢?
4 楼 liangcoder 2013-07-21  
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
3 楼 zh_harry 2013-07-21  
孤独的CPU 写道
说的很笼统,也仅仅是思考下。

这已经很详细了,具体的有代码,我框架里有,就不在这帖了,有兴趣的可以去下代码,看一下。
2 楼 孤独的CPU 2013-07-21  
说的很笼统,也仅仅是思考下。
1 楼 lvwenwen 2013-07-21  
疯子在思考之IOC

相关推荐

    JAVA设计模式之IOC实战02

    JAVA设计模式之IOC实战02

    Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程.doc

    Spring 框架系列(7)- Spring IOC 实现原理详解之 IOC 初始化流程 本文将详细解释 Spring 框架中的 IOC(Inversion of Control,控制反转)实现原理之 IOC 初始化流程。IOC 是一种软件设计模式,用于将软件系统中...

    Spring之IOC示例

    在IT行业中,Spring框架是Java开发领域中一个极为...通过阅读《Spring之IOC示例》这篇博客(博文链接:https://huangminwen.iteye.com/blog/1041298),可以更深入地理解Spring的IOC机制,并学习如何在实际项目中应用。

    自己实现ioc实例demo

    在IT行业中,依赖注入(IOC,Inversion of Control)是一种设计模式,它使得应用程序的组件之间解耦,提高了代码的可测试性和可维护性。在这个“自己实现ioc实例demo”中,我们将探讨如何通过XPath解析XML文件来实现...

    springIoc实现原理

    Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中...

    JAVA设计模式之IOC实战01

    JAVA设计模式之IOC实战01

    Spring中IoC优点与缺点解析

    IoC 容器在 Spring 框架中是一种非常有用的设计模式,它可以简化对象的创建和管理,解耦合对象之间的依赖关系,提高开发效率和降低出错率。但是,使用 IoC 容器也可能会增加对象生成的步骤和效率损耗。

    spring Ioc容器配置

    spring Ioc容器配置 IOC容器数据源配置 &lt;!-- 配置数据源 --&gt; destroy-method="close"&gt; &lt;value&gt;org.gjt.mm.mysql.Driver &lt;value&gt;jdbc:mysql://localhost:3306/demo &lt;value&gt;root ...

    Android进阶——框架打造之IOC框架

    Android进阶——框架打造之IOC框架 实现通过Id找到控件的功能 实现通过Id找到Color、String资源 实现绑定view的点击事件、长按事件 实现绑定SetContentView 实现绑定网络的检测功能

    图片转IOC图标工具

    使用.IOC图标可以确保在不同设备上显示的图标大小适中、清晰无损,提升用户体验。而这款工具则简化了这一过程,使得开发者无需手动调整每个尺寸,大大提高了工作效率。 首先,我们来了解一下.IOC图标的组成部分。一...

    雷赛IOC0640.rar

    在压缩包子文件的文件名称列表中,仅有一个条目“雷赛IOC0640”,这可能意味着压缩包内包含的是关于IOC0640的综合资料,除了已知的DMC2210硬件手册外,还可能有用户手册、软件驱动、配置工具、技术规格表、示例代码...

    IoC 依赖注入 技术总结

    静态 IoC 的优点是实现简单、效率高,仅需要在客户端 XML 文件变更时,才实现类的生成、编译等工作,以后在运行期间直接调用 Class 文件即可,编译期已经实现依赖注入,具有编译期检查特点,占用较少的空间而赢得...

    JavaEE Spring IoC入门

    在Spring框架中,IoC容器是核心组件,它负责创建、装配和管理对象。IoC容器通过读取XML配置文件来理解对象及其依赖关系,然后自动进行实例化和装配。这样,开发者不再需要手动创建和管理对象,而是将这些控制权交给...

    IoC小例子(了解一下IoC设计模式入门)

    IoC设计模式的实现通常依赖于容器,如Spring框架在Java中就是一个著名的IoC容器。开发者可以通过XML配置、注解或者编程式的方式来定义对象及其依赖关系。例如,在Spring中,我们可以在XML配置文件中定义Bean(代表一...

    iocdemo.rar

    在本示例"iocdemo.rar"中,我们将探讨如何模仿Spring的IoC原理,通过XML配置和注解两种方式进行Bean的管理。 **控制反转(IoC)** IoC意味着应用程序的控制权由传统的程序流程控制转向了外部容器,即Spring框架。在...

    IOC练习事列

    在本例中,我们将探讨一个基于C#实现的简单IOC练习。 **容器机制**: 在IOC中,容器是负责管理对象生命周期和对象间依赖关系的核心组件。它会根据配置或编程方式来决定何时创建对象、如何创建对象以及对象之间的...

    IOC模式 c#经典例子

    IOC(Inversion of Control,控制反转)模式是一种软件设计原则,它在面向对象编程中用于解耦组件之间的依赖关系。C#中实现IOC的一种常见方式是通过依赖注入(Dependency Injection,DI)。在这个“IOC模式 c#经典...

    spring ioc

    Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件之间的依赖管理。在本文中,我们将深入探讨 Spring IOC 的概念、工作原理以及如何在实际项目中应用。 首先,理解 IOC ...

    SpringIoC的简单实现

    【SSH进阶之路】一步步重构容器实现Spring的IoC——解决容器对组件的“侵入式”管理的两种方案--服务定位器和IoC容器(九) 【SSH进阶之路】一步步重构容器实现Spring的IoC——工厂+反射+配置文件实现IoC容器(十)

    IOC详解IOC详解IOC详解IOC详解

    控制反转(IOC,Inversion of Control)是一种设计模式,它在软件工程中被广泛应用,特别是在Java开发中。IoC的核心思想是将对象的创建和管理权交给一个外部容器,而不是让对象自行创建和管理依赖。这有助于降低耦合...

Global site tag (gtag.js) - Google Analytics