Guice是一个轻量级,基于Java 5(主要运用泛型与注释特性)的依赖注入框架(IOC)。Guice非常小而且快,Guice是安全的类型,它能够对构造函数、属性、方法进行注入。
Guice提供的3种注入方式
Guice通过@Inject标注来实现依赖注入,它根据作用的对象不同分为方法注入、构造方法注入、字段注入3种注入方式。
在使用@Inject进行注入时,需要通过标注@ImplementedBy(SunyangImpl.class)来声明Sunyang接口的实现类。下面分别说明这3种注入方法。
1.使用成员变量进行注入
新建一个类,在类中添加类型为Sunyang的成员变量sunyang,通过@Inject标注声明该成员变量为被注入的变量,同时使用Guice的方法createInjector()将此变量注入,并用getInstance()方法将其取出。
createInjector方法可以有多个参数,它的参数均为接口Module类型。没有参数时,Inject标注作用的属性全部进行注入,相反将参数的内容注入。属性必须存在于createInjector方法的类中,如代码12-10所示。
代码12-10    成员变量注入
package sunyang.inject;
import sunyang.Sunyang;
import com.google.inject.Guice;
import com.google.inject.Inject;
public class Field {
  @Inject
  private Sunyang sunyang;
    
  public static void main(String[] args) {
              Guice.createInjector().getInstance(Field.class).sunyang.print();
        }
}
在代码12-10的main方法中得到被注入的接口Sunyang类型的成员变量sunyang,然后执行其print方法。得到的结果如图12-4所示。
Guice中的IoC_Guice中的IoC
图12-4  使用成员变量注入
2.使用构造方法进行注入
使用构造方法进行注入,需要在类中增加Sunyang类型的成员变量,然后定义一个包含Sunyang类型参数的构造方法,通过@Inject标注声明构造方法将其注入,在main方法中将其取出,并执行其属性sunyang的print方法,如代码12-11所示。
代码12-11  构造方法注入
package sunyang.inject;
import sunyang.Sunyang;
import com.google.inject.Guice;
import com.google.inject.Inject;
public class Constructor {
  private Sunyang sunyang;
  @Inject
  public Constructor(Sunyang sunyang) {
    this.sunyang = sunyang;
  }
  public static void main(String[] args) {
    Guice.createInjector().getInstance(Constructor.class).sunyang.print();
  }
}

使用构造方法进行注入可以保证接口Sunyang只在类初始化时被注入,构造方法的注入是唯一的。运行代码如图12-4所示。
3.使用setter方法进行注入
使用setter方法进行注入,需要在类中增加对成员变量设置的setter方法,同时通过标注@Inject将其声明,然后在main方法中将其取出,如代码12-12所示。
代码12-12  setter方法注入
package sunyang.inject;
import sunyang.Sunyang;
import com.google.inject.Guice;
import com.google.inject.Inject;
public class Setter {
  private Sunyang sunyang;
  @Inject
  public void setSunyang(Sunyang sunyang) {
    this.sunyang = sunyang;
  }
  public static void main(String[] args) {    
    Guice.createInjector().getInstance(Setter.class)
.sunyang.print();
  }
}
此方法是在对象sunyang被构造的时候才进行注入的,相对于构造方法更加灵活。
上文中Guice为我们提供了3种注入,这3种注入方法各有其优缺点,可以根据实际需要灵活使用。