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

依赖注入(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框架的依赖注入和控制反转)