我在 Guice 中有三个模块:
- ReflectionsModule,用于提供元数据(通过 Reflections)
- PersistenceModule,用于数据访问对象和其他
- WebModule,用于 Web 内容
简单地说,PersistenceModule 和 WebModule 都会获取由 Reflections Module 生成的对象。我找不到一种非常友好的方式来做到这一点。
我认为 PrivateModules 将是一个合适的方法,但我不确定如何实现。有什么想法吗?
谢谢。
一些其他详细信息
我正在使用反射。它基本上是一个从静态资源加载持久性元数据的包装器。所以基本上假设将解析后的 XML 文件转换为 JavaBean。这就是 ReflectionsModule 关心的问题。
从这个元数据到 javabean,我需要设置持久性(它是一个 Google App Engine 应用程序,使用 Objectify)并加载其他类并绑定(bind)它们,同时读取其中的一些注释。我不想加载资源,所以我想引用第一个示例中加载的资源。
现在,ReflectionsModule 还绑定(bind)了两个后续模块,我(正确地)得到了它们,并将它们应用到仅使用第一个模块构建时出现的 createChildInjector 。就像现在的操作系统一样,它可以工作。我只是想知道哪种方式是最好的。
最佳答案
简单来说,PrivateModule 只公开使用 .expose() 方法的 @Exposed 注释显式公开的绑定(bind)。因此,如果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 的绑定(bind)将不会比两个 PrivateModule 暴露得更远,因此不会相互冲突。
仅公开只能由一个模块提供的类通常是一种很好的做法。
关于java - Guice 跨模块注入(inject)以实现共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3078671/