我是一个 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/