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或者注解等方式,得到交给容器控制的所有类的依赖关系,在程序运行过程中进行创建,并且可以执行这些类的行为。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 相信无论是初学PHP的新手, 还是多年经验的PHP老司机, 在学习Laravel这套框架的时候, 总是会被依赖注入...
    范仁镗阅读 2,727评论 0 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,908评论 18 139
  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 6,750评论 2 22
  • 一束微弱的阳光从洞壁斜射了进来,花金叶轻轻的走了进来,见武娇那微弱鼾声,她叹了口气:‘这孩子--一个亲人都没了,真...
    MissGirls组合Anne阅读 481评论 0 5
  • 因为开完家长会已经9点半了,但是我答应她回来,就一定要回来陪她。对女儿基本没有爽约,她也是这样子对我。 日期:20...
    trevorcheng阅读 153评论 0 0