使用 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 以获取更多文档。