zoukankan      html  css  js  c++  java
  • IOC和DI到底是什么?

       在学习Spring框架的时候,我们总是能见到IOC这个单词,也时常听到DI这个词,那么他们分别是什么意思呢?接下来就讲讲个人对于这两个概念的理解

       一、IOC和DI概念

      IOC(控制反转):全称为:Inverse of Control。从字面上理解就是控制反转了,将对在自身对象中的一个内置对象的控制反转,反转后不再由自己本身的对象进行控制这个内置对象的创建,而是由第三方系统去控制这个内置对象的创建。

      DI(依赖注入):全称为Dependency Injection,意思自身对象中的内置对象是通过注入的方式进行创建。

         那么IOCDI这两者又是什么关系呢?

      IOC就是一种软件设计思想,DI是这种软件设计思想的一个实现。而Spring中的核心机制就是DI。

       二、实例理解IOC

    class Person{
        
        private Wear clothe;
    
        public Wear getClothe() {
            return clothe;
        }
    
        public void setClothe(Wear clothe) {
            this.clothe = clothe;
        }
        
        public void Wear(){
            clothe  = new Sweater();
            clothe.WearClothe();
        }   
    }
    
    interface Wear{
        void WearClothe();
    }
    
    class Sweater implements Wear{
    
        @Override
        public void WearClothe() {
            // TODO Auto-generated method stub
            System.out.println("穿毛衣");
        }    
    }
    
    class Shirt implements Wear{
        @Override
        public void WearClothe() {
            // TODO Auto-generated method stub
            System.out.println("穿衬衫");
        }    
    }
    public static void main(String[] args){
            Person person = new Person();
            person.Wear();
        }

      在上面的代码中我们定义一个Wear接口,两个实现了该接口的类Sweater和Shirt,在Person类的Wear需要调用Wear接口的WearClothe方法,传统的做法是在Person的Wear中创建该接口的实现类,然后通过该对象对调用这个方法。在Person对象的内部创建了这个对象,既是控制了这个对象,当我们需要调用Shirt的WearClothe方法的时候就需要改动Person类中Wear方法的代码,去创建一个Shirt类对象。

      而在IOC的设计思想中,我们将不再Person的内部进行创建Clothe属性的引用对象,而是在外界创建该对象,然后注入到Person对象中。代码实现如下:

      修改Person类的Wear方法:

      public void Wear(){
            clothe.WearClothe();
        }

      在main方法中调用:

      public static void main(String[] args){
            Wear wear= new Sweater();
            Person person = new Person();
            person.setClothe(sweater);
            person.Wear();
        }

       通过在外界创建一个Wear接口的实现类对象,然后将该对象传入person对象中,将person对象对于sweater对象的控制反转,person对象不再进行Wear接口实现对象的创建。如果我们需要调用Shirt的wear方法,只需要更改创建Shirt对象,不再需要修改Person类内部的方法,就可以实现了。

        这就是我理解的IOC,简单来说就是把本来在类内部控制的对象,反转到类外部进行创建后注入,不再由类本身进行控制,这就是IOC的本质。

     

  • 相关阅读:
    HDU 5640 King's Cake
    HDU 5615 Jam's math problem
    HDU 5610 Baby Ming and Weight lifting
    WHU1604 Play Apple 简单博弈
    HDU 1551 Cable master 二分
    CodeForces659C Tanya and Toys map
    Codeforces 960E 树dp
    gym 101485E 二分匹配
    Codeforces 961E 树状数组,思维
    Codeforces Round #473 (Div. 2) D 数学,贪心 F 线性基,模板
  • 原文地址:https://www.cnblogs.com/huangweikun/p/5187356.html
Copyright © 2011-2022 走看看