IOC 理解三
一:依赖倒置(DIP)和依赖注入(DI)
《敏捷软件开发》第11章:
意思大概就是 IoC ioc = the_pattern; DI di = (DI)ioc,显然,说the_pattern是IoC或DI都行,多态。但严格说IoC.class == DI.class肯定不为真,两者还是有区别,是 is-a 的关系。不过正如不少人把Service和ServiceImpl分开,但Service事实上永远只有一个ServiceImpl实现一样,IoC虽然理论上还有其他实现,但DI过于主流,以至于混用了。
依赖倒置原则
a.高层模块不应该依赖于底层模块,二者都应该依赖于抽象。
b.抽象不应该依赖于细节,细节应该依赖于抽象。
可见,依赖倒置的本质是依赖抽象,这与依赖注入的本质依赖容器,是两回事。换句话说,如果Java没有接口、多态,依赖倒置就无从谈起。而依赖注入依然可以存在,只要有一个注册表(《企业应用架构模式》第18章第5节)定义bean,利用反射来实例化并装配bean,有个容器容纳它们即可。
二:控制反转(IoC)和依赖注入(DI)
《EXPERT ONE ON ONE J2EE DEVELOPMENT WITHOUT EJB》第6章:IoC主要的实现方式有两种:依赖查找,依赖注入。(128页)流行的「Martin Fowler将IoC改名为DI」的说法,Martin Fowler的原文在这里: Inversion of Control Containers and the Dependency Injection pattern
依赖注入是一种更可取的方式。(130页)
As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection.大意是:已经存在某种模式,该模式被称为IoC,但IoC太普遍,任何框架都IoC,为了让表意更明确,决定用DI来精确指称那个模式。
意思大概就是 IoC ioc = the_pattern; DI di = (DI)ioc,显然,说the_pattern是IoC或DI都行,多态。但严格说IoC.class == DI.class肯定不为真,两者还是有区别,是 is-a 的关系。不过正如不少人把Service和ServiceImpl分开,但Service事实上永远只有一个ServiceImpl实现一样,IoC虽然理论上还有其他实现,但DI过于主流,以至于混用了。

浙公网安备 33010602011771号