Guice:使用带有自己参数的构造函数注入 class?
Guice: Inject class with constructor with own parameters?
我对 Guice 有疑问。我想用一个例子来说明这一点。我想始终动态传递此构造函数的参数,例如新测试(“鲍勃”,765);。我还希望 Guice 注入一些字段(比如这里的 SomeOtherObject)。我怎样才能做到这一点?提前致谢!
public class Test {
private String name;
private int id;
//Needs to be injected by Guice
@Inject
SomeOtherObject object;
public Test(String name, int id) {
this.name = name;
this.id = id;
}
}
Guice 的 AssistedInject 功能是处理此问题的好方法。
基本上,您定义一个工厂来获取 Test
个对象:
public interface TestFactory {
public Test create(String name, int id);
}
使用 @Assisted
注释扩充 Test
class 的 @Inject
构造函数:
public class Test {
@Inject
public Test(SomeOtherObject object, @Assisted String name, @Assisted int id) {
this.object = object;
this.name = name;
this.id = id;
}
}
然后在模块的配置中使用 FactoryModuleBuilder
:
install(new FactoryModuleBuilder().build(TestFactory.class));
而不是直接构造 Test
s,而是注入一个 TestFactory
并使用它来创建 Test
s:
public class OtherThing {
@Inject
TestFactory factory;
public Test doStuff(Stirng name, int id) {
return factory.create(name, id);
}
}
注意:现在查看文档,似乎 AutoFactory 已被引入作为执行此操作的首选方法,并且可能更简单。
我对 Guice 有疑问。我想用一个例子来说明这一点。我想始终动态传递此构造函数的参数,例如新测试(“鲍勃”,765);。我还希望 Guice 注入一些字段(比如这里的 SomeOtherObject)。我怎样才能做到这一点?提前致谢!
public class Test {
private String name;
private int id;
//Needs to be injected by Guice
@Inject
SomeOtherObject object;
public Test(String name, int id) {
this.name = name;
this.id = id;
}
}
Guice 的 AssistedInject 功能是处理此问题的好方法。
基本上,您定义一个工厂来获取 Test
个对象:
public interface TestFactory {
public Test create(String name, int id);
}
使用 @Assisted
注释扩充 Test
class 的 @Inject
构造函数:
public class Test {
@Inject
public Test(SomeOtherObject object, @Assisted String name, @Assisted int id) {
this.object = object;
this.name = name;
this.id = id;
}
}
然后在模块的配置中使用 FactoryModuleBuilder
:
install(new FactoryModuleBuilder().build(TestFactory.class));
而不是直接构造 Test
s,而是注入一个 TestFactory
并使用它来创建 Test
s:
public class OtherThing {
@Inject
TestFactory factory;
public Test doStuff(Stirng name, int id) {
return factory.create(name, id);
}
}
注意:现在查看文档,似乎 AutoFactory 已被引入作为执行此操作的首选方法,并且可能更简单。