您所在的位置:主页 > JAVA技术 >

Spring的IoC/DI的理解

时间:2014-02-27 09:53来源:未知 作者:疯狂java 点击:

 
 
 一、Spring IoC也称控制反转或依赖注入
 
  理解:将对象的创建交给IoC容器进行管理(IoC容器也就是我们俗称的BeanFactory或者是ApplicationContext),由IoC容器负责引用对象的创建
 
  传统的方法:
 
  由于Demo类中包含User类(就是IoC中所称的依赖),如果Demo类的话就需要使用User类的话,必须由Demo类自己创建User类的一个实例来引用,User创建的由Demo进行控制,这个时候就产生了高度耦合。
 
  缺陷:
 
  1).如果后期修改了User的构造方法,那每个依赖User的类型可能都需要进行修改,这样就形成了代码的高度耦合了。
 
  2).每new一个对象时需要消耗一定内存的,像具有几十或者几百个Bean时会对应用产生一定的压力。
 
  代码示例:
 
  package com.jeng.mvc.model;
 
  import java.io.Serializable;
 
  public class Demo implements Serializable {
 
  private static final long serialVersionUID = -792765360926635161L;
 
  private Long id;
 
  private String name;
 
  private User user = new User();
 
  public User getUser() {
 
  return user;
 
  }
 
  public void setUser(User user) {
 
  this.user = user;
 
  }
 
  public Long getId() {
 
  return id;
 
  }
 
  public void setId(Long id) {
 
  this.id = id;
 
  }
 
  public String getName() {
 
  return name;
 
  }
 
  public void setName(String name) {
 
  this.name = name;
 
  }
 
  public Demo() {
 
  super();
 
  }
 
  }
 
       采用了Spring IoC技术:
 
  IoC容器管理对象之间的依赖关系(对象的创建),由于Demo中提供User的set方法,IoC容器通过set方法将创建好的User对象注入到Demo中,此时Demo就可以通过getUser()获得User的引用,
 
  代码示例:
 
  package com.jeng.mvc.model;
 
  import java.io.Serializable;
 
  public class Demo implements Serializable {
 
  private static final long serialVersionUID = -792765360926635161L;
 
  private Long id;
 
  private String name;
 
  private User user;
 
  public User getUser() {
 
  return user;
 
  }
 
  public void setUser(User user) {
 
  this.user = user;
 
  }
 
  public Long getId() {
 
  return id;
 
  }
 
  public void setId(Long id) {
 
  this.id = id;
 
  }
 
  public String getName() {
 
  return name;
 
  }
 
  public void setName(String name) {
 
  this.name = name;
 
  }
 
  public Demo() {
 
  super();
 
  }
 
  }
 
  优点:
 
  1).IoC容器提供给依赖对象的接口setUser()和getUser()方法,由IoC容器负责依赖对象的创建,Demo只负责调用getUser()即可,不必关系对象的实例化,实现了松耦合
 
  2).IoC容器还可对Bean做特殊的处理,比如定义Bean的单例模式等
 
  总结:
 
 
  A类包含B类(或A类依赖B类)
 
  依赖注入就是由IoC容器负责A类的依赖关系中B类的实例化,并由IoC注入到B类中。
 
  控制反转就是将原本属于A类实例化B类的控制,交给IoC容器进行实例化控制。