美文网首页程序员
Spring框架的依赖注入和控制反转

Spring框架的依赖注入和控制反转

作者: 不完全程序员 | 来源:发表于2018-10-08 21:35 被阅读10次

    依赖注入(dependency inject)

    依赖是开发中不可缺少的场景,每一个业务需求都需要多个类都实体相互依赖完成,但是对象之间的依赖却给开发带来了很多不便,因此提出了注入的概念。

    举个例子:

    public class Soldier {

    public void shot(){

    System.out.println("soldier shot!");

    }

    }

    Knight有一个方法attack,要完成这个举动必须要soldier来进行,也就是Knight依赖Soldier,所以这里两个类就紧耦合在一起。

    所以Knight的attack就受到了Soldier的限制了,那依赖注入怎么解决?

    1.把Soldier定义为一个接口

    2.通过Knight的构造器注入Soldier的具体对象

    3.对于Knight而言,无需关注Soldier具体是实现类,只需要在attack时调用soldier进行shot即可

    public class Knight {

    private Soldier soldier;

    public Knight(Soldier soldier) {

    this.soldier = soldier;

    }

    public void attack(){

    soldier.shot();

    }

    }

    public interface Soldier {

    public void shot();

    }

    public class Navy implements Soldier {

    @Override

    public void shot() {

    System.out.println("navy attack!");

    }

    }

    public class AirForce implements Soldier {

    @Override

    public void shot() {

    System.out.println("AirForce is attacking!");

    }

    }

    public class Knight {

    private Soldier soldier;

    public Knight() {

    soldier = new Soldier();

    }

    public void attack(){

    soldier.shot();

    }

    }

    依赖注入往往和控制反转(Inversion of Control)说到一起,控制反转指对象的控制权、生命周期等行为不再由客户端(调用方)来控制,而是由IoC容器来控制,调用方不再需要关心他要调用的对象如何产生,只要告诉容器,我要用某个对象了,由容器来提供。

    传统的编程方式,在对象需要另一个对象时,都是主动来创建对象,控制对象都行为,因此这种通过容器来提供对象都创建和销毁都方式,形象的成为控制反转。

    Spring框架通过Ioc这种设计思想,将所有的类都注册到容器中,告诉容器:

    1.A是什么类

    2.A需要哪些类(依赖)

    有了这两个信息,在程序运行的时候,容器就会在适当的时候把依赖的类注入到A中,对A来说,以前是他控制这些依赖类,现在就是统一由Spring容器来提供,这种控制的行为就被反转了。

    依赖注入是基于java的反射机制实现的,java提供了反射机制,在程序运行中,就可以通过反射得到一个类的全部属性和方法,并且可以调用,Spring就可以通过xml或者注解等方式,得到交给容器控制的所有类的依赖关系,在程序运行过程中进行创建,并且可以执行这些类的行为。

    相关文章

      网友评论

        本文标题:Spring框架的依赖注入和控制反转

        本文链接:https://www.haomeiwen.com/subject/ricsaftx.html