IoC的原理

一句化来概括 IoC :IoC 是一种帮助我们解耦个业务对象之间依赖关系的对象绑定方式。

首先来理解一下 IoC 原理,刚进公司的时候见领导的时候,听到总监和另外一名同事说 IoC 很简单,当时的具体设问场景我已经记不清了。在深入了解 IoC 之后,觉得确实简单,不过同一件事情、同一个思想,在具体落地实现中,才真正体现水平高低,这里简单介绍一下 IoC 原理。

一、未使用IoC思想

// 业务bean
public class ClassA{
    private ClassB b = new ClassB();
    public void setB(ClassB b) {
        this.b = b
    }
    public ClassB getB() {
        return this.b;
    }
}

// 业务bean
public class ClassB{
}

// 处理逻辑
public class Test{
    public static void main(){
        ClassA a = new ClassA();
    }
}

上面的代码中 ClassA 依赖于 ClassB,在 ClassA 实例化时对依赖的 ClassB 也做了实例化。被注入对象直接依赖于被依赖对象,被注入对象直接负责被依赖对象的实例化。

二、使用IoC思想

// 业务bean
public class ClassA{
    // 不进行实例化动作
    private ClassB b;
    public void setB(ClassB b) {
        this.b = b
    }
    public ClassB getB() {
        return this.b;
    }
}

// 业务bean
public class ClassB{
}

// 处理逻辑
public class Test{
    public static void main(){
        container.getBean("a");
    }
}

// IoC容器
public class Container{
    Map<String, Object> beanMap = new HashMap<>();
    public Container() {
        ClassB classB = new ClassB();
        ClassA classA = new ClassA();
        classA.setB(classB); 
        beanMpa.add("b", classB);
        beanMap.add("a", classA);
    }
    public Object getBean(String beanName){
        return beanMap.get(beanName);
    }
}

被注入对象和依赖对象都由 Container(IoC Service Provider)统一管理,它们之间的依赖也由 Container 来注入。对 业务 bean 之前进行解耦,让我们的业务 bean 保持为简单的 POJO。

三、IoC的优势

依赖于接口,而不依赖于实现类,使系统和业务易于拓展。

// 业务bean
public class ClassA{
    private ClassB b;
    public void setB(ClassB b) {
        this.b = b
    }
    public ClassB getB() {
        return this.b;
    }
}

// 业务接口(有多个实现类)
public interface ClassB{
}

// 业务bean(默认实现)
public interface ClassB1 implement ClassB{
}

// 业务bean(拓展实现)
public interface ClassB2 implement ClassB{
}

// 处理逻辑
public class Test{
    public static void main(){
        container.getBean("a1");
        container.getBean("a2");
    }
}

// IoC容器
public class Container{
    Map<String, Object> beanMap = new HashMap<>();
    public Container() {
        ClassB classB1 = new ClassB1();
        ClassB classB2 = new ClassB2();
        ClassA classA1 = new ClassA();
        classA1.setB(classB1); 
        ClassA classA2 = new ClassA();
        classA2.setB(classB2); 
        beanMpa.add("b1", classB1);
        beanMpa.add("b2", classB2);
        beanMap.add("a", classA1);
        beanMap.add("a", classA2);
    }
    public Object getBean(String beanName){
        return beanMap.get(beanName);
    }
}

面向接口编程,在增加 ClassB 新的实现类时,不需要修改依赖于 ClassB 接口的类。

四、写在最后

文中的 Container 相当粗糙,管理的更多的 bean ,这样硬编码的 Container 就力有不逮了。正常 Container 会配合指定的配置文件一起使用,Container 中包含稳定的处理逻辑,bean 的描述信息和 bean之前的依赖关系信息由指定的配置文件来给定。Container 通过读取配置文件来达到管理 bean 和 依赖注入的能力

一句化来概括 IoC :IoC 是一种帮助我们解耦个业务对象之间依赖关系的对象绑定方式。

跳转目录:https://www.cnblogs.com/bsyt/p/13162588.html

posted @ 2020-07-11 14:44  白色烟头  阅读(574)  评论(0编辑  收藏  举报