Guice提供的3种注入方式
Guice通过@Inject标注来实现依赖注入,它根据作用的对象不同分为方法注入、构造方法注入、字段注入3种注入方式。
在使用@Inject进行注入时,需要通过标注@ImplementedBy(SunyangImpl.class)来声明Sunyang接口的实现类。下面分别说明这3种注入方法。
1.使用成员变量进行注入
新建一个类,在类中添加类型为Sunyang的成员变量sunyang,通过@Inject标注声明该成员变量为被注入的变量,同时使用Guice的方法createInjector()将此变量注入,并用getInstance()方法将其取出。
createInjector方法可以有多个参数,它的参数均为接口Module类型。没有参数时,Inject标注作用的属性全部进行注入,相反将参数的内容注入。属性必须存在于createInjector方法的类中,如代码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();
}
}
使用构造方法进行注入,需要在类中增加Sunyang类型的成员变量,然后定义一个包含Sunyang类型参数的构造方法,通过@Inject标注声明构造方法将其注入,在main方法中将其取出,并执行其属性sunyang的print方法,如代码12-11所示。
代码12-11 构造方法注入
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();
}
}
使用setter方法进行注入,需要在类中增加对成员变量设置的setter方法,同时通过标注@Inject将其声明,然后在main方法中将其取出,如代码12-12所示。
代码12-12 setter方法注入
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();
}
}
上文中Guice为我们提供了3种注入,这3种注入方法各有其优缺点,可以根据实际需要灵活使用。