我正在尝试学习谷歌果汁。我有一个InstallConfigurationModule类,该类具有创建typeA和TypeB对象所需的所有依赖关系。并且,有一个类如下所示的Car类,并且正在尝试进行构造函数注入。当运行方法被调用时,在system.out.println行上获取了空指针异常。我确定ModuleA,ModuleB可以创建TypeA,TypeB,因为
InstallConfigurationModulemodule,如果我说Bind(TypeA.class)或Bind(TypeB.class),我会收到google juice错误,“绑定到已经配置的typeA或typeB”。
public class InstallConfigurationModule extends AbstractModule {
@Override
protected void configure() {
install(new ModuleA());
install(new ModuleB());
}
}
public class Car
{
private Type A;
private Type B;
@inject
void SetCar(Type A, Type B)//not the constructor
{
this.A=A;
this.B=B;
}
private void run()
{
System.out.println(A.toString()) //throw null pointer exception
}
工作原理:
private void run()
{
Injector injector = Guice.createInjector(new
InstallConfigurationModule());
TypeA typeA =injector.getInstance(TypeA.class);
System.out.println(A.toString()) //works fine
}
当我尝试不创建createInjector时为什么得到NPE。任何帮助表示赞赏。
PS:果汁很新。
最佳答案
让我们假设我们具有以下组成部分:
类接口
public interface Type {}
接口实现
public class TypeImpl implements Type {
private String name;
public TypeImpl(String name) {this.name = name;}
public String getName() {return name;}
@Override
public String toString() {return name.toString();}
}
配置模块
public class InstallConfigurationModule extends AbstractModule {
@Override
protected void configure() {
super.configure();
// new ModuleA()
bind(Type.class).annotatedWith(Names.named("a")).toInstance((Type) new TypeImpl("a"));
// new ModuleB()
bind(Type.class).annotatedWith(Names.named("b")).toInstance((Type) new TypeImpl("b"));
}
}
它不使用安装方法,但是您可以使用它; configure方法使用Names.named API将TypeImpl标记为“ a”,将另一个标记为“ b”。
我们必须将@Named和@Inject批注放入Car类中
import com.google.inject.name.Named;
import javax.inject.Inject;
public class Car {
private Type a;
private Type b;
@Inject
public void setA(@Named("a") Type a) {
this.a = a;
}
@Inject
public void setB(@Named("b") Type b) {
this.b = b;
}
public void methodIsCalled(){
run();
}
private void run() {
System.out.println(a.toString());
System.out.println(b.toString());
}
}
因此,注入器将知道如何配置Type实例。
最后,在主类或配置类中,我们有以下语句
public class MainClass {
public static void main(String[] args){
Injector injector = Guice.createInjector(new InstallConfigurationModule());
Car car = injector.getInstance(Car.class);
// method that it calss the run method
car.methodIsCalled();
}
}
这是输出
a
b