依赖注入的前提:
有IOC的环境,也就是将必须对象的创建权交给了Spring.
DI 介绍
Dependency Injection 依赖注入.需要有IOC 的环境,Spring 创建这个类的过程中,Spring 将类的依赖的属性设置进去.
IOC与DI的的区别:
IOC: 控制反转,将类的对象的创建交给Spring类管理创建.
DI: 依赖注入,将类里面的属性在创建类的过程中给属性赋值.
DI和IOC的关系: DI不能单独存在,DI需要在IOC的基础上来完成.
这样做得好处:做到了单一职责,并且提高了复用性,解耦了之后,任你如何实现,使用接口的引用调用的方法,永远不需要改变
举一个栗子:
写个接口,说咱们购物去~
public interface IShopping { void drive(); String Money(); }
在实现它两下:有钱人购物,没钱人购物 - -!这栗子举的
public class RichMan implements IShopping{ @Override public void drive() { System.out.println("Drive By Benz"); } @Override public String Money() { System.out.println("lot`s of money"); return "10000"; } }
public class PoorGuy implements IShopping{ @Override public void drive() { System.out.println("take a walk!"); } @Override public String Money() { System.out.println("nothing"); return "1"; } }
然后我们出去玩,顺便shopping一下吧~
public class Play { private IShopping shoppingSomething;
//使用构造方法,将实现传入 public Play(IShopping shoppingSomething){ this.shoppingSomething = shoppingSomething; } public void withgirlFriend(){ shoppingSomething.drive(); shoppingSomething.Money(); }
}
将想用的实现方式,用容器注入进来,这里就模拟下下怎么注入:
public class Containner { public Play getShopping(){ return new Play(new RichMan()); } }
测试一下:
public static void main(String[] args) { Containner containner = new Containner(); Play play = containner.getShopping(); play.withgirlFriend(); }
结果是:
Drive By Benz
lot`s of money
如果再依赖注入的配置时,配置为穷人的实现,那我们的代码都不用变,结果就会改变~