java - 如何真正理解IOC
阿神
阿神 2017-04-17 15:56:15
[Java讨论组]

如何真正理解SpringIOC原理,有谁理解的更深层点。

阿神
阿神

闭关修行中......

全部回复(6)
阿神

先看下没有IOC的情况:

//没有IOC的情况
class Project {

    //实现一个java开发者和php开发者,省略其方法实现部分
    JavaDeveloper javaer = new JavaDeveloper(){...};
    javaer.coding();
}

可以看到Project是依赖于JavaDeveloper的,这时如果需求突然变了,java开发者被赶出团队,进来php开发者,只能硬改Project类了:

//将原来的JavaDeveloper修改如下:
PhpDeveloper phper = new PhpDeveloper(){...};
phper.coding();

这里的坏处是,一旦项目变得复杂,Developer会越来越多,这样每次变动都会导致Project类必须修改.甚至后期有了新的需求,要求这个Developer可以根据需求随时更换,怎么办?

现在看有IOC的情况:

//先产生一个Developer接口
interface Developer(){
    coding();
}
class Project {

    //在IOC的情况中,通常使用setter的方式注入这个developer
    Developer dever = null;    
    setDevloper(Developer developer){
        this.dever = developer;
    }
    //这里不用担心dever为null的问题,
    //IOC框架会在Project对象初始化时用set方法把developer注入进来,
    //当然除了setter方式还可以在构造函数中注入.
    dever.coding();
}
class PhpDeveloper implements Developer(){
    coding(){...}
}
class JavaDeveloper implements Developer(){
    coding(){...}
}

此时Project不再依赖于JavaDeveloper了,外部有一个xml来管理注入的内容,这里是片断:

<!-- 这里可以随时切换为JavaDeveloper -->
<Developer>PhpDeveloper</Developer> 

此时,依赖关系被提到了Project的上层,这就是控制反转, 而各种Developer通过依赖注入的方式实现了这一目标.

顺便说一下,除了spring可以实现IOC,其实简单的IOC自己写点代码也能实现,无非是读配置生成对象再注入而已,除了JAVA的IOC,其他各种语言也都有IOC的解决方案.

大家讲道理

就是把new对象统一交给容器管理,然后容器负责把对象new好,根据依赖关系去帮你注入进去,相当于帮你管理了对象的依赖。

PHP中文网

IOC其实并没有什么难的,只是表面上有点绕,这篇播客希望对你有帮助:《Spring IOC(依赖注入、控制反转)概念理解》

黄舟

之前我看各种代码也不理解,后来看了一篇博文就懂了,个人觉得比各种示例代码都有用:客户程序员使用库,框架使用客户程序员。这就是控制是否被反转了的区别。控制反转是框架和库的关键区别所在。对于一个库而言,用户程序员使用的方式是主动调用它,这是通常情况的做法,也就是“正向”控制;而对于一个框架,往往将用户程序员编写的代码注册到框架中,最后由框架来调用用户程序员编写的代码,这就构成了控制反转。也就是说,控制反转的关键在于“控制者”是谁。对于一个库而言,复用的可能只是算法和数据结构;而对于一个框架而言,复用的往往还有控制流逻辑,这也是控制反转的结果。

引用

控制反转 (IoC) 和依赖注入 (DI)

阿神

Spring的IoC原理 这篇文章讲的很好,可以帮助理解

PHPz

简单浏览了大家推荐的文章,主要是从代码的角度做说明。换个角度,用 UML 图可能更直观一些。

无 IoC 代码的类图

IoC 代码的类图

  • 通过 Developer 接口实现的「控制反转」,Project 和 PhpDeveloper 都信赖于 Developer Interface

  • 这个结构也正是面向对象设计原则中的「接口隔离」

  • 使用这个结构之后,在 Project 中创建 PhpDeveloper 的职责谁来做?使用「工厂模式」或「信赖注入」都可以

推荐这本《敏捷软件开发——原则、模式与实践》

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号