我正在尝试注入一些类,同时在构造函数中传递一些参数。为了实现这一点,我发现了这个问题(1,2),说这可以通过在工厂中使用辅助注射来实现。这就是我的代码的样子,按照提供的示例和阅读相关文档后的一些修改。
gradle脚本
dependencies {
compile 'org.roboguice:roboguice:3.+'
provided 'org.roboguice:roboblender:3.+'
compile 'com.google.inject.extensions:guice-assistedinject:3.+'
}
带有接受参数的create方法的工厂接口
public interface ICustomObjectFactory {
ICustomObject create(Callback callback);
}
实现接口的类
public class CustomObject implements ICustomObject {
protected String name;
@AssistedInject
public CustomObject(@Assisted Callback callback){
this.callback = callback;
}
}
从应用程序类使用和调用的模块
public class SomeModule extends Module {
@Override
protected void configure() {
install(new FactoryModuleBuilder()
.implement(ICustomObject.class, CustomObject.class)
.build(ICustomObjectFactory.class));
}
}
从应用程序类注册的注入模块
@Override
public void onCreate() {
super.onCreate();
RoboGuice.getOrCreateBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE,
RoboGuice.newDefaultRoboModule(this), new SomeModule(this));
}
工厂的使用
public class SomeClass implements Callback {
@Inject ICustomObjectFactory factory;
public SomeClass () {
ICustomObject first = this.factory.create(this);
}
}
有了这样的一切,当我尝试使用工厂时,我遇到了这个错误,因为它已经在某事类
中使用过了
java.lang.IllegalStateException: Factories.create() factories cannot be used until they're initialized by Guice.
at com.google.inject.internal.util.$Preconditions.checkState(Preconditions.java:142)
at com.google.inject.assistedinject.FactoryProvider2.getBindingFromNewInjector(FactoryProvider2.java:564)
at com.google.inject.assistedinject.FactoryProvider2.invoke(FactoryProvider2.java:625)
at java.lang.reflect.Proxy.invoke(Proxy.java:397)
at $Proxy12.create(Unknown Source)
有人知道为什么工厂没有初始化?我知道这应该由模块初始化,我确信它已经被调用了。
我的代码和链接的问题中的代码之间最明显的区别是,在问题中,构造函数的注释是@Inject
,而不是@AssistedInject
。在这次修改之前,我在编译应用程序时遇到了这个错误。
错误:任务“:app:compileDebugJavaWithJavac”的执行失败。java.lang.ClassCastException: com.sun.tools.javac.code.Type 不能强制转换为 javax.lang.model.type.DeclaredType dle 的依赖缓存可能已损坏(这有时会在网络连接超时后发生)。重新下载依赖项并同步项目(需要网络)
也许这不是实现我需要的最好方法。如果不是,有人能告诉我正确的方向吗?
谢谢大家的帮助
AssistedInject
在 Roboguice 3 中不受支持
我很高兴你可以让它在禁用注释数据库
的情况下工作。您之前的错误:
com.sun.tools.javac.code.Type cannot be cast to javax.lang.model.type.DeclaredType
是在签名中具有基元类型的构造函数上使用@Inject
时发生的。查看此答案
允许您使用< code>AnnotationsDatabase的一个简单解决方案是使用< code>Provider
binder.bind(CustomObject.class).toProvider(CustomObjectProvider.class);
然后注入提供程序
,如下所示:
public class CustomObjectProvider implements Provider<CustomObject> {
Callback callback;
@Inject
public CustomObjectProvider(Callback callback) {
this.callback = callback;
}
@Override
public CustomObject get() {
return new CustomObject(callback);
}
}
最后,我通过添加<code>RoboGuice来实现它。应用程序类中的setUseAnnotationDatabases(false):
@Override
public void onCreate() {
super.onCreate();
RoboGuice.setUseAnnotationDatabases(false);
RoboGuice.getOrCreateBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE,
RoboGuice.newDefaultRoboModule(this), new SomeModule(this));
}
我一直在用guice做一个项目。 我有一个抽象类,它有很多实现。为了使用正确的实现,我使用一个工厂,它接收参数,然后返回正确的实例。 演示代码 我想知道的是,如果我可以用替换工厂,直接注入的实现(请注意,它们应该使用辅助注入)? 谢谢你。
我是一名guice新手,试图弄清楚如何使用FactoryModuleBuilder在guice中实现辅助注入。我参考了guice java文档来实现FactoryModuleBuilder。 我所做的一切都完全按照文件中所说的那样。这不是注射工厂。我提到了这个堆栈溢出问题:Guice AssistedInject不会注入具有相同问题的工厂。它讨论了构造函数注入之前的字段注入问题。我遵循了它,并尝试
我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con
假设有一个类A,它的构造函数是这样的: 还有AFactory: 所以要创建一个A的实例,我显然需要做这样的事情: 但是,假设我有其他类:例如,B类、C类和D类具有类型为A的成员(带有字段注入,但也可以是ctor): 我希望将 A 的相同实例注入到这些类中。但仍然可以选择将 A 的另一个实例注入其他类(假设 E 类和 F 类)。 正确的做法是什么?我就是想不出一个干净的方法来做到这一点。
我是Guice的新手,所以我试图理解AssistedInject。我有一个非常简单的项目: 我要注入的类: 带辅助注射的类别: 工厂 主类: 但它仍然不起作用,我不明白,我错在哪里?
我有这个接口和简单的实现: 我想使用Guice用不同的方法生成一个。