[#0x002E] 依赖、依赖注入以及控制反转
1. 何为依赖
不管是面向对象,还是面向过程,一个应用总会分成许多的模块,然后由这些模块协同工作完成任务。要协同工作就会产生依赖,如一个方法调用另一个方法、一个对象包含另一个对象,这些都是依赖关系。?
比如:类A要包含对象b的话,就需要在A里B b = ?new B(),这里明显是类A依赖对象b(因为怎么看都不像是对象b依赖类A……)
?
2. 何为依赖注入
I have to say, the translation sucks! I'd rather use 'Dependency Injection' or 'DI' instead.
?
所谓DI,就是由容器动态的生成依赖关系,应用可以方便的获取依赖(通俗地说就是类A不用再亲自B b = new B()来获取b对象)。从外表上看,就好像是容器将生成的依赖关系注入到应用之中。
?
3. DI的3种实现方式
Interface Injection: 类A里不是用对象b,而是接口IB的实现ib,ib由外部创建并传入类A,类A不负责创建工作,如:?就指定了调用UpperAction的setMessage("HeLLo")。
?
Constructor Injection: 与Setter Injection相对,Construction Injection就是不使用Setter,而是使用带参构造器来创建对象b。且不允许应用调用类B的Setter(可以根本不提供Setter给应用)。与Setter Injection相比,Constructor Injection创建对象b比较方便(Setter Injection要逐个域来Set),且保持了对象b的一致性,但不如Setter Injection来得灵活。
4. 控制反转I have to say it again, the translation sucks! I'd rather use 'IoC' instead.
?
控制反转,IoC,Inversion of Control,实为“控制的反转”,差一个字理解就差这么远。
IoC,用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。