我一直在用guice做一个项目。
我有一个抽象类,它有很多实现。为了使用正确的实现,我使用一个工厂,它接收参数,然后返回正确的实例。
演示代码
@Singleton
public class MyFactory {
private final Foo foo;
@Inject
public MyFactory(final Foo foo) {
this.foo = foo;
}
public A create(final Bar bar) {
switch (bar) {
case 0:
return new B(foo, bar);
case 1:
return new C(foo, bar);
//this goes on
}
}
}
public abstract A {
public A(final Bar bar) {
//do sth
}
}
public B extends A {
private final Foo foo;
public B(final Foo foo, final Bar bar) {
super(bar);
this.foo = foo;
}
}
public C extends A {
private final Foo foo;
public C(final Foo foo, final Bar bar) {
super(bar);
this.foo = foo;
}
}
我想知道的是,如果我可以用Guice
替换工厂,直接注入A
的实现(请注意,它们应该使用辅助注入)?
谢谢你。
您仍然需要My被害人根据您的id
选择实现,尽管您的辅助注入可能非常短。
// No need for this to be @Singleton;
// if you want the same shared Foo instance, make it @Singleton
public class MyFactory {
private final B.Factory bFactory;
private final C.Factory cFactory;
@Inject
public MyFactory(B.Factory bFactory, C.Factory cFactory) {
this.bFactory = bFactory;
this.cFactory = cFactory;
}
public A create(final Bar bar) {
switch (bar.getSomeInteger()) { // I assume you're checking a
// property of bar
case 0:
return bFactory.create(bar);
case 1:
return cFactory.create(bar);
//this goes on
}
}
}
public B extends A {
public interface Factory {
B create(Bar bar);
}
private final Foo foo;
public B(final Foo foo, @Assisted final Bar bar) {
super(bar);
this.foo = foo;
}
}
public C extends A {
public interface Factory {
C create(Bar bar);
}
private final Foo foo;
public C(final Foo foo, @Assisted final Bar bar) {
super(bar);
this.foo = foo;
}
}
以及您的模块:
public class YourModule extends AbstractModule {
@Override public void configure() {
install(new FactoryModuleBuilder().build(B.Factory.class));
install(new FactoryModuleBuilder().build(C.Factory.class));
}
}
编辑:在我的示例中,您不需要调用FactoryModuleBuilder上的< code>implement,因为< code>B.Factory有一个返回子类B的< code>create方法。那么您将需要< code>implement调用,因为Guice不知道要调用哪个构造函数。
如果您想强制消费者对实现进行编码,您可能需要引用只返回接口的工厂。这通常是一个隐藏实现细节的好主意,可能需要创建<code>a。工厂使用方法A创建(条形码)
并将其与实现
>连接。然而,这在这里是不必要的,因为您的MyFactory已经返回了A并隐藏了实现子类(与<code>A.Factory</code>的逻辑类似),并且您需要<code>@Named</code>或其他限定符注释来区分这两个<code>A。您正在创建的工厂绑定。简言之,这是额外的复杂性,对这个特定的案例没有好处。
我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con
我有一个工厂是这样的: 这样的类: 如何正确使用Google Guice来做同样的事情?我尝试了辅助注射,但我不确定如何创建“UrlBuilder”。谁能帮忙?
我是一名guice新手,试图弄清楚如何使用FactoryModuleBuilder在guice中实现辅助注入。我参考了guice java文档来实现FactoryModuleBuilder。 我所做的一切都完全按照文件中所说的那样。这不是注射工厂。我提到了这个堆栈溢出问题:Guice AssistedInject不会注入具有相同问题的工厂。它讨论了构造函数注入之前的字段注入问题。我遵循了它,并尝试
目前,我将辅助注射与命名参数一起使用,如下所示: 这很棒。但是我认为使用字符串作为参数的标识符有点难看。我想做的是以下内容: 所以本质上我想要自定义辅助注释。有办法做到这一点吗?
我已经使用google-guice和辅助注射机制有一段时间了。因为我在scala,刚刚发现scala-guice,我也对使用它感兴趣。但是我对如何使用辅助注射感到困惑。没有使用辅助注射的例子。 因此,我的问题是:是否可以使用scala guice辅助注射,如果可以,请提供一个简单的例子? 此外,对于google-guice,我使用以下库:javax.inject.jar、guice-3.0.jar
我正在尝试在Guice进行辅助注射。 这是我的实现。 工厂界面。 吉思模块: 我得到错误:“DaoFactory不能用作键;这一点没有充分说明”。 我应该如何配置FactoryModuleBuilder? 我的目标是在运行时使用DaoFactory获取Dao的类型化实例