如何真正理解IOC
澳门威尼斯人官网
澳门威尼斯人官网
当前位置 : 澳门威尼斯人官网 > www.vn99.net

如何真正理解IOC

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

先看下没有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;    
    setDevloperDeveloper 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好,根据依赖关系去帮你注入进去,相当于帮你管理了对象的依赖。

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

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

引用

控制反转 IoC 和依赖注入 DI

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

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

无 IoC 代码的类图

IoC 代码的类图

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

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

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

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

栏目列表

广告位

澳门威尼斯人官网