控制反转(IoC=Inversion of ControlIoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。由spring来负责控制对象的生命周期和对象间的关系。

所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

DIDependency Injection)依赖注入,IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DIDependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉springA中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的,而依赖注入(DI)是通过反射来实现的。

      

  1.  
  2. public static void main(String[] args) {  
  3.   ApplicationContext context = new FileSystemXmlApplicationContext(  
  4.     "applicationContext.xml");  
  5.   Animal animal = (Animal) context.getBean("animal");  
  6.   animal.say();  
  7.  }  
  8.  
  9.  
  10. //这段代码你一定很熟悉吧,不过还是让我们分析一下它吧,首先是applicationContext.xml  
  11. <bean id="animal" class="phz.springframework.test.Cat">  
  12.   <property name="name" value="kitty" />  
  13.  </bean>  
  14.  
  15.  
  16. //他有一个类phz.springframework.test.Cat  
  17. public class Cat implements Animal {  
  18.  private String name;  
  19.  public void say() {  
  20.   System.out.println("I am " + name + "!");  
  21.  }  
  22.  public void setName(String name) {  
  23.   this.name = name;  
  24.  }  
  25. }  
  26.  
  27. //实现了phz.springframework.test.Animal接口   
  28. public interface Animal {  
  29.  public void say();  
  30. }  
  31. //很明显上面的代码输出I am kitty!