天天看点

DI与IOC

前言

在对spring回顾中,这两个术语贯穿spring的整个体系,之前没有进行深入理解和探讨,这里作为总结和记录。

理解

控制反转(Inversion of Control)和依赖注入(Dependency Injection)是同一个实现的不同面,这里用spring做参考。

  • 为什么要使用

参考:http://insights.thoughtworkers.org/injection/,Martin Fowler大师的描述已经很简单很完善了

  • 实现了什么

通过控制反转将每次主动new创建对象的方式交给 IOC 来操作,具体来说是spring框架中的ioc容器来管理,再通过依赖注入的手段将合适的实例或者其子类实例注入到需要的对象中(成为其某一个字段),由此实现整个逻辑中依赖对象的创建和调用。

  • 解决了什么

通过 IOC 解决了对象间的耦合问题,这是最重要的,其次才是对象的管理

  • 控制反转(Inversion of Control)

控制主要是针对对象的创建、销毁等整个生命的周期的管理控制,

反转是控制权的反转,本来手动控制对象创建等操作交给IOC来自动管控,由IOC容器来控制整个对象的生命周期,

通过IOC,我们不需要关系对象的创建,我们需要的时候主动找IOC获取即可,丧失了创建对象、管理等的权力,获得了不用考虑对象耦合、管理的问题好处。

  • 依赖注入(Dependency Injection)

DI和IOC描述的同一样事情,只不过所站的角度不同

       IOC:所站的是对象角度,对于对象而言,IOC实现了对象的控制权反转,将控制权交给了IOC容器

       DI:所站的是IOC容器角度,对于容器而言,如果对象A依赖于对象B,容器就会将对象B注入到对象A中

参考资料

Martin Fowler:https://martinfowler.com/articles/injection.html

Martin Fowler中文翻译:http://insights.thoughtworkers.org/injection/

大白话:https://juejin.im/post/5961bd955188250da35f05d7