依赖注入的原理

  • 控制反转
    • 机械手表的例子:齿轮相互独立并且相互作用池合在一起,协同工作,组成一个齿轮组去完成某一项任务。如果这些齿轮中有一个出现问题,可能就会影响整个齿轮组的正常运作。

      齿轮组中齿轮之间的啮合关系与软件系统中对象 之间 的 耦合 关系 非常 相似。 对象之间 的耦合关系是无法避免 的, 而且随着工业级应用的规模越来越 庞大, 对象之间的依赖关系也越来越 复杂, 经常会出现对象之间的多重依赖性关系。 为了解决对象之间 耦合度过高问题, 软件专家 Michael Mattson 提出 了 IoC 理论, 用来实现对象之间的解 耦。 IoC 是 Inversion of Control 的缩写, 即控制 反转。 IoC理论提出的观点大体是这样 的: 借助于“ 第三方实现具有依赖关系的对象之间的解耦。 如图 9- 5 所示, 引入 IoC 容器 后, 使得 A、 B、 C、 D 这 4 个 对象 没有 了 耦合 关系, 齿轮 之间 的 传动 全部 依靠 IoC 容器。 如果 去掉 中间 的 IoC 容器, 我们 就会 发现 A、 B、 C、 D 这 4 个 对象 之间 已经 没有 了 耦合 关系, 彼此之间 毫无 联系,

  • 依赖注入
    •   获得依赖对象的过程被反转了;控制被反转之后,获得依赖对象的过程由自身管理变为由IoC容器主动注入,于是,又给控制反转取了一个更适合的名字,叫做依赖注入(Dependency Injection),简称DI。所谓依赖注入,是指由IoC容器在运行期间,动态地将某种依赖关系注入到对象中
  • 依赖注入的实现方式
    • 编写代码时我们常常会发现有一些类是依赖于其他类的,所以类A可能需要一个类B的引用或对象,这里举一个汽车的例子:
      public class Car {
          private Engine mEngine;
          public Car(){
              mEngine = new PetroEngine();
          }
      }
      
    • car和Engine高度耦合,在car中需要自己创建Engine,并且car还需要知道Engine的实现方法,也就是Engine的实现类PetroEngine的存在;一旦Engine的类型变为其他的实现比如DieseEngine,则需要修改Car的构造方法;
    • 用依赖注入进行改造,以下三种方法明显将Car和Engine解耦合了,Car不关心Engine的实现,即时Engine的类型变换了
      • 构造方法注入
        public class Car {
            private Engine mEngine;
            public Car(Engine engine){
                mEngine = engine
            }
        }
        

          

      • Setter方法注入
        public class Car {
            private Engine mEngine;
        
            public void set(Engine engine){
                this.mEngine = engine;
            }
        }
        

          

      • 接口注入
        public interface Icar{
            public void setEngine(Engine engine);
        }
        
        public class Car implements ICar {
            private Engine mEngine;
            @Override
            public void set(Engine engine){
                this.mEngine = engine;
            }
        }

猜你喜欢

转载自www.cnblogs.com/endian11/p/9100228.html