java - 在 guice 中使用带有 FactoryModuleBuilder 的辅助注入(inject) - 工厂注入(inject)未完成

标签 java guice guice-3 assisted-inject

我是一个 guice 新手,试图弄清楚如何使用 FactoryModuleBuilder 在 guice 中实现辅助注入(inject)。我查阅了 guice java 文档以实现 FactoryModuleBuilder .

我已经按照文档中的说明完成了所有操作。
它没有注入(inject)工厂。
我提到了这个堆栈溢出问题:Guice AssistedInject won't inject the factory
有同样的问题。
它讨论了构造函数注入(inject)问题之前的字段注入(inject)。我跟着它,我试图使用调用者类调用父类,但我仍然得到空指针异常。这里出了什么问题?

调用者类

public class MAIN {

    @Inject private static MyFactory factory;

    public static void main(String[] args){
        ParentClass newbie = new ParentClass(factory);
    }
}

我仍然遇到异常:
Exception in thread "main" java.lang.NullPointerException
    at com.pkg.ParentClass.<init>(ParentClass.java:19)
    at com.pkg.MAIN.main(MAIN.java:10)

家长类
public class ParentClass {

    private final Foo test;
    @Inject
    public ParentClass(MyFactory factory){
        test = factory.create(new HashMap<String,Object>());
    }
}

模块实现:ParentModule
public class ParentModule extends AbstractModule{

    @Override
    protected void configure() {
        install(new FactoryModuleBuilder()
                .implement(Foo.class, FooImpl.class)
                .build(MyFactory.class));
    }

}

工厂接口(interface):MyFactory
public interface MyFactory {

    Foo create(Map<String,Object> map);
}

类接口(interface):Foo
public interface Foo{
}

类:FooImpl
public class FooImpl implements Foo {

    private final Map<String,Object> mapA;
    @AssistedInject
    public FooImpl(@Assisted Map<String,Object> map){

        mapA=map;
    }

}

最佳答案

你这里有两个问题。

首先也是最重要的,你不是在创建 Injector任何地方。显然,没有注入(inject)器,任何事情都不会奏效。您必须使用您的模块创建一个注入(inject)器实例:

Injector injector = Guice.createInjector(new ParentModule());

您的第二个问题是您想将工厂注入(inject)静态字段:
@Inject private static MyFactory factory;

尽管如果您明确告诉 Guice 可以使用静态字段,但它被认为是非常糟糕的做法。除非您使用一些遗留代码,否则您永远不应该注入(inject)静态字段。

你真正想要的是这样的:
public class Main {
    @Inject
    private MyFactory factory;

    public void run() {
        ParentClass newbie = new ParentClass(factory);
    }

    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new ParentModule());
        Main main = injector.getInstance(Main.class);
        main.run();
    }
}

请注意,程序入口点 ( main ) 现在创建了一个注入(inject)器,然后使用它来创建 Main 的实例类,它将自动注入(inject)其字段。然后它调用方法run()在执行实际工作的实例上。

但是请注意,这一切仅用于辅助注入(inject)的说明性目的才真正有效。你不应该像这样构造你的真实代码。例如,您正在使用 new运算符来创建其构造函数带有 @Inject 注释的类.永远不要这样做!如果您将某个类(即其构造函数或字段)标记为 @Inject能,那么这个类应该只能通过注入(inject)的方式来使用。您的 Main代码可以缩短为以下:
public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new ParentModule());
        ParentClass newbie = injector.getInstance(ParentClass.class);
    }
}

这里newbie将自动接收 MyFactory 的实例到它的构造函数中,因为它被注解为 @Inject .

我已经写过关于静力学的文章。

关于java - 在 guice 中使用带有 FactoryModuleBuilder 的辅助注入(inject) - 工厂注入(inject)未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16688956/

相关文章:

java - JDBC 找不到正确的 MySql 数据库

Java - 并行读取二进制文件

java - 如何在 guice 提供程序中获取绑定(bind)目标?

java - 在 AWS Lambda 中集成 Google Guice

java - Guice3 Singleton 从未在 GAE 项目中实例化

java - 如何显示来自后台线程的 toast 消息

singleton - 如何在 Guice 上找到所有实现特定类型的单例?

使用 Lombok 和 Guice 注入(inject)进行 Java 链继承

java - Guice -如何在扩展抽象模块的类中注入(inject)依赖项 - Java

java - 将 T 作为参数传递给以在 Java 中有条件地创建泛型