Malagu 框架中大量使用了 IoC 和依赖注入,在使用 Malagu 框架的时候,不可避免会使用到 IoC 和依赖注入。如果您以前没有接触过 IoC 和依赖注入,本篇文档将带您了解什么是 IoC 和依赖注入?为什么我们需要它。如果您在其他框架中已经接触过,可以跳过。
什么是 IoC 和依赖注入
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI**),还有一种方式叫“依赖查找”(Dependency Lookup)。
IoC 是面向对象编程的一种设计原则。所有它与具体框架和 java 无关,只要你用的开发语言支持面向对象编程就需要它。所有你会发现 go、php、java、js 等等语言都会存在 IoC 相关的框架或者库。
为什么我们需要 IoC
对象的创建托管给 IoC,可以解耦,也让 AOP 这样能力得以方便实现。一个普通项目中,绝大部分的 bean 对象都是单例的,创建一个单例对象是简单的,但是创建一堆相互之间有依赖关系的单例对象是很复杂的。这时候 DI(依赖注入)就发挥作用了。DI 不仅仅解决复杂依赖关系自动构建,而且性能上也做了极致的优化。比如 DI 并不会在项目启动的时候创建所有对象实例,而是按照项目实际运行情况,按需创建和注入对象。
面向对象编程有一个很重要的原则是面向抽象编程,或者说依赖倒置。好处是接口是抽象不变的,而接口的实现是多样可变的。因为我们将对象托管给了 IoC,IoC 能让我们无侵入式地替换默认的实现。这对于开发框架和应用模块至关重要,因为只有这样,你的框架或模块才能更加容易实现低耦合,可扩展的能力。
你可能会想:我的业务项目不需要可扩展,甚至低耦合。但是你用的开发框架需要,所以你也需要,因为你需要通过 IoC 机制扩展框架的默认行为。(如何业务实在太简单了,不用当然也没问题,使用一个不带 IoC 能力的框架也不错)
其实,业务项目也是特别需要可扩展和低耦合的。因为我们不可能只开发一个单模块的业务项目,大部分情况我们需要开发多个业务项目,每个业务项目由多个模块组成,这时候你会发现,有些模块在多个项目之间可以复用,虽然存在些许差异。我们可以把差异抽象成通用接口,并提供常用的默认实现,在特殊场景下,可以提供自己实现,通过 IoC 替换掉默认实现。
虽然,我们做业务项目开发,但是我们也需要用开发框架的方式来开发我们的业务项目,这样你的业务项目才更具扩展性、低耦合、易维护。所以面向对象编程对抽象能力要求很高,我们要在业务当中不断发现可抽象的地方,让其沉淀为公司的知识资产。
抽象最难的是如何把握这个度,过了这个度,就是过度设计了,过度设计很可怕,每个合格的程序员都会或多或少有过过度设计。过度设计是相对而言的。