使用 google guice 的 mvp 场景实际涉及什么?
What is actually involved in a mvp scenario to use google guice?
我非常熟悉使用spring 来使用@Bean 和@Autowired 进行注入。我已经转而查看 guice,我想知道让它发挥作用的最低限度是什么。以下基本示例抛出 NPE:
import javax.inject.Inject;
public class ClassA {
String a = "test";
@Inject
public ClassA() {
System.out.println(a);
}
public void go() {
System.out.println("two");
}
}
以下class 试图实例化 ClassA 的新实例:
import javax.inject.Inject;
public class ClassB {
@Inject
ClassA guice;
public ClassB() {
guice.go();
}
public static void main(String[] args) {
ClassB b = new ClassB();
}
}
我尝试了以下各种组合,但均未成功:
public class SupportModule extends AbstractModule {
@Override
protected void configure() {
bind(ClassA.class);
//bind(ClassA.class).to(ClassB.class);
//others too
}
}
我一定是在这里某处遗漏了一个关键的东西,我不太确定在哪里?我需要 guice/configuration 本身的一些手动实例化吗?我想我可能会。
guice.go();
<= NullPointerException 出现在这里,显然obj 是null 因为我的guice 设置不对
在 Spring 中,我可以执行以下操作,我想 Guice 也可以帮助我执行此操作:
@Bean
public FrameworkProperties properties() {
return new FrameworkProperties();
}
然后只是:
@Autowired
FrameworkProperties props;
do I need some manual instantiation of guice/configuration itself? I assume I possibly do.
是的,你猜对了。您必须 bootstrap 使用 Guice.createInjector()
方法定义的注入器模块。另外,需要注意的另一件事是,当使用像 ClassB 中那样的自定义构造函数时,您必须使用构造函数注入。因此,为了使其正常工作,ClassB 应如下所示:
public class ClassB {
private ClassA guice;
@Inject //This will inject the dependencies used in the constructor arguments
public ClassB(final ClassA guice) {
this.guice = guice;
guice.go();
}
public static void main(String[] args) {
/**
* If only type to type binding is required, you can skip creating a Module class &
* bootstrap the injector with empty argument createInjector like used below. But, when
* there are other kind of bindings like Type to Implementations defined in modules, you can use:
* final Injector injector1 = Guice.createInjector(new GuiceModule1(), new GuiceModule2());
*/
final Injector injector = Guice.createInjector();
final ClassB b = injector.getInstance(ClassB.class); //This will create dependency graph for you and inject all dependencies used by ClassB and downwards
}
}
此外,您可以删除在 ClassA 的构造函数中使用的 @Inject 注释,因为您没有在该构造函数中注入任何外部依赖项。您可以查看 Guice 的入门指南 wiki 以获取更多文档。
我非常熟悉使用spring 来使用@Bean 和@Autowired 进行注入。我已经转而查看 guice,我想知道让它发挥作用的最低限度是什么。以下基本示例抛出 NPE:
import javax.inject.Inject;
public class ClassA {
String a = "test";
@Inject
public ClassA() {
System.out.println(a);
}
public void go() {
System.out.println("two");
}
}
以下class 试图实例化 ClassA 的新实例:
import javax.inject.Inject;
public class ClassB {
@Inject
ClassA guice;
public ClassB() {
guice.go();
}
public static void main(String[] args) {
ClassB b = new ClassB();
}
}
我尝试了以下各种组合,但均未成功:
public class SupportModule extends AbstractModule {
@Override
protected void configure() {
bind(ClassA.class);
//bind(ClassA.class).to(ClassB.class);
//others too
}
}
我一定是在这里某处遗漏了一个关键的东西,我不太确定在哪里?我需要 guice/configuration 本身的一些手动实例化吗?我想我可能会。
guice.go();
<= NullPointerException 出现在这里,显然obj 是null 因为我的guice 设置不对
在 Spring 中,我可以执行以下操作,我想 Guice 也可以帮助我执行此操作:
@Bean
public FrameworkProperties properties() {
return new FrameworkProperties();
}
然后只是:
@Autowired
FrameworkProperties props;
do I need some manual instantiation of guice/configuration itself? I assume I possibly do.
是的,你猜对了。您必须 bootstrap 使用 Guice.createInjector()
方法定义的注入器模块。另外,需要注意的另一件事是,当使用像 ClassB 中那样的自定义构造函数时,您必须使用构造函数注入。因此,为了使其正常工作,ClassB 应如下所示:
public class ClassB {
private ClassA guice;
@Inject //This will inject the dependencies used in the constructor arguments
public ClassB(final ClassA guice) {
this.guice = guice;
guice.go();
}
public static void main(String[] args) {
/**
* If only type to type binding is required, you can skip creating a Module class &
* bootstrap the injector with empty argument createInjector like used below. But, when
* there are other kind of bindings like Type to Implementations defined in modules, you can use:
* final Injector injector1 = Guice.createInjector(new GuiceModule1(), new GuiceModule2());
*/
final Injector injector = Guice.createInjector();
final ClassB b = injector.getInstance(ClassB.class); //This will create dependency graph for you and inject all dependencies used by ClassB and downwards
}
}
此外,您可以删除在 ClassA 的构造函数中使用的 @Inject 注释,因为您没有在该构造函数中注入任何外部依赖项。您可以查看 Guice 的入门指南 wiki 以获取更多文档。