InversionofControl控制反转(InversionofControl),简称IoC,它不是一种技术,而是一种设计思想,面向对象编程的一个重要原则。它可以指导我们如何设计松散耦合的、更好的程序。传统应用中,我们主动在类内部创建依赖对象,导致类间耦合度高,测试难度大。如下图所示:图1但是有了IoC容器,我们可以把创建和寻找依赖对象的控制权交给容器,容器会注入组合对象,所以对象是松耦合的,这也是方便的。测试有利于功能复用,更重要的是,它使得程序的整个架构非常灵活。如下图所示:图2DependencyInjectionDependencyInjection简称DI,不是一种技术,它是一种实现IoC的方式,组件之间的依赖关系由容器在运行时决定。即某种依赖被容器动态注入到组件中。依赖注入的目的不是给软件系统带来更多的功能,而是增加组件重用的频率,为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,无需任何代码,指定目标需要的资源,完成自己的业务逻辑,而不用关心具体的资源来自哪里,由谁来实现。如图2所示。什么是容器?容器是为特定组件的运行提供必要支持的软件环境。比如Tomcat就是一个Servlet容器,可以为Servlet运行提供一个运行环境。像Docker这样的软件也是一个容器,它提供了运行特定Linux进程所必需的Linux环境。这里,容器是指实现对象依赖关系自动管理,避免人工管理缺陷,管理对象生命周期的环境。下面用伪代码来说明容器、控制反转和依赖注入的关系。我们知道,电脑一般都具备外接键盘、鼠标、U盘等功能。如下:但是这种能力一般依赖于USB接口,如下:如果不使用依赖注入,我们一般采用在程序内部直接新建对象的方式,如下:永不升级时,没有这样做的问题很大,因为我们也可以达到一生一次手术的效果。但现实是,再强大的神机也会面临岁月的折磨,我们的USB接口也终有一天会变老,速度相当慢,跟不上时代的步伐,不兼容最新的C型接口。所以我们需要升级,但是如果像以前一样直接new,那么就需要直接修改核心逻辑,如果有多个地方要用,那么就需要修改多个地方。相当于如果要更换一个USB接口,那就需要更换主板(忽略处理器、内存等接口版本的差异),拆机、安装、插跳线、配置BIOS等.,非常麻烦。那我们可不可以把这个工作交给别人,我们就只做一个电脑用户呢?把这种复杂的工作和控制权交给所谓的“其他人”的想法就叫做控制反转。.而我们把这个工作交给helper来完成,交给helper的操作的实现就是依赖注入。依赖注入有两种方式,一种是通过构造函数,比如构造函数中的Helper参数如下:另一种是通过setter方法进行赋值。从上图我们可以看出,只要我们通过$helper注入不同的USB接口对象,这台电脑就可以实现不同的USB切换。虽然现在可以实现依赖注入,但是我们每次都需要手动传递。如果这样的依赖注入很多,后期维护起来就是一个复杂的工程。这时候容器的作用就体现出来了。这里容器根据类名自动实现类的实例化,并调用相关方法,如下图所示。这里的关键是类的反射。通过反射获取类的构造函数和参数,然后通过构造函数实现依赖注入,最终达到控制反转的目的。
