我在Guice中有三个模块:
简单地说,PersistenceModule和WebModule都将获取一个由Reflections Module制作的对象。在guice中我找不到一个非常友好的方式来做到这一点。
我认为PrivateModules将是一种合适的方式,但我不确定如何实现它。有什么想法吗?
谢谢。
我正在使用Reflections。它基本上是从静态资源加载持久性元数据的包装器。因此基本上将解析后的XML文件假设为JavaBean。这就是ReflectionsModule的关注点。
从这个元数据到javabean,我需要设置持久性(它是一个使用Objectify的Google App Engine应用程序)并加载其他类并在阅读其中的一些注释时绑定它们。我不想加载资源,所以我想引用从第一个示例加载的资源。
现在,ReflectionsModule还绑定了两个后续模块,我得到(正确)并将它们应用到仅使用第一个模块构建时出现的createChildInjector。就像现在一样,它有效。我只想知道哪种方式最好。
答案 0 :(得分:2)
简单来说,PrivateModules只公开使用.expose()方法的@Exposed注释显式公开的绑定。因此,如果PersistenceModule和WebModule都是PrivateModule,则可以执行以下操作:
public class WebModule extends PrivateModule {
@Override
public void configure() {
install(new ReflectionsModule());
// do stuff...
expose(SomeClassFromWebModule.class);
}
}
public class PersistenceModule extends PrivateModule {
@Override
public void configure() {
install(new ReflectionsModule());
// do stuff...
expose(SomeClassFromPersitenceModule.class);
}
}
通过这种方式,来自ReflectionsModule的绑定不会比两个PrivateModule暴露更多,因此不会相互碰撞。
通常,只展示只能由一个模块提供的类。
答案 1 :(得分:2)
编辑:找到更好的答案:https://stackoverflow.com/a/5504903/105741 - 基本上使用@Provides注释来获取模块中的方法参数,这些参数是从其他模块注入的依赖项。工作得更好。即对于需要DependencyClass的绑定,我将该代码移动到一个方法中,使用@Provides注释公开它,并将DependencyClass添加为方法参数。
@dyross - 我认为这不是他所要求的。
不止一次创建ReflectionModule并不是一个好主意,并且PrivateModules与该问题没有任何关系 - 共享绑定到子模块(如果我正确理解他)。我有同样的需求,并使用了将所需对象传递给子模块的技术,即。
Injector parentInjector = Guice.createInjector(new ParentModule());
DependencyClass dep = parentInjector.getInstance(DependencyClass);
injector = parentInjector.createChildInjector(new ChildModule(dep));
即
Injector reflectionsModule = Guice.createInjector(new ReflectionsModule());
DependencyClass dep = parentInjector.getInstance(DependencyClass);
injector = parentInjector.createChildInjector(
new PersistenceModule(dep),
new WebModule(dep));
不理想,但是达到目的。
我刚刚发现你可以将注入器传递给子模块,并直接从子模块内部传入getInstance()。