Spring IOC 理解

首先创建2两矿泉水公司A和B。

然后在创建Boss类相当于客户端程序。里面实例化了A公司,表示boss与A签订了一份协议。

可是有一天,A公司该做饮料,不提供矿泉水了。于是boss去与B公司签了协议。

Boss以为这次可以高枕无忧了,由于A公司经营不善,做饮料亏了,又改做矿泉水,为了提升业绩他们的水卖的比B公司便宜。Boss又想改回,买A公司的。

为了避免折腾,老板对张三说:“以后水的事情就由你负责了,买哪家的水由你来决定”。这样boss与矿泉水公司的关系就变成间接的了。中间多了个张三。

 

这样一来就重新设计:

首先呢,要先设计一个接口,并且提供一个提供水服务的方法。    然后AB两家公司都来实现这个接口。

 public interface IWaterCompany {
 public Water getWater();
}

public class ACompany implements IWaterCompany {
    Water water;
 @Override
 public Water getWater() {
  System.out.println("A 公司的哦。。。");
  return water;
 }

}

public class BCompany implements IWaterCompany {
    Water water;
 @Override
 public Water getWater() {
  System.out.println("B 公司的哦。。。");
  return water;
 }
}

现在可以编写客户端程序调用它的服务了。这个客户端就是改写boss类。

public class Boss {
private IWaterCompany iwc;
public void needWater(){
 getIwc().getWater();
}
public IWaterCompany getIwc() {
 return iwc;
}
public void setIwc(IWaterCompany iwc) {
 this.iwc = iwc;
}
}s

那么接下来,A和B公司如何注入给Boss呢?下面写个测试类。

public class ClientTest {
 public static void main(String[] args) {
      Boss boss = new Boss();
      boss.setIwc(new BCompany());
      boss.needWater();
 }
}

这里发现了一个重要的事情,Boss在这次变更中仍然完好无缺,也就是说这次变更他的内在结构,只要改变TestClient就可以了。TestClient就是充当张三这种角色。不过spring中不以客户端类存在,而是一个xml文件。通过这种接口隔离的方式实现控制反转。

原文地址:https://www.cnblogs.com/kunpengit/p/2250927.html