如何真正理解IOC


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

java

betlich 8 years, 5 months ago

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

引用

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

假发小太郎 answered 8 years, 5 months ago

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

窝了一个槽 answered 8 years, 5 months ago

先看下没有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的解决方案.

kanloli answered 8 years, 5 months ago

在这样一个前提下,你怎么去操作一个题材一个内容,那就要用你自己的艺术创作方式
[url=https://168won.com/view/fcssq/index.html]福彩双色球结果[/url]
[url=https://168won.com/view/shishicai_xy/ssc_index.html]幸运时时彩走势图[/url]
[url=https://168won.com/view/xingyft/pk10kai.html]幸运飞艇直播[/url]
lesliehuang answered 1 year, 9 months ago

Your Answer