Guice Injection跨模块共享

时间:2010-06-20 08:44:58

标签: java module guice

我在Guice中有三个模块:

  • ReflectionsModule,用于提供元数据(通过思考)
  • PersistenceModule,用于数据访问对象和其他
  • WebModule,适用于Web Stuff

简单地说,PersistenceModule和WebModule都将获取一个由Reflections Module制作的对象。在guice中我找不到一个非常友好的方式来做到这一点。

我认为PrivateModules将是一种合适的方式,但我不确定如何实现它。有什么想法吗?

谢谢。

一些其他细节

我正在使用Reflections。它基本上是从静态资源加载持久性元数据的包装器。因此基本上将解析后的XML文件假设为JavaBean。这就是ReflectionsModule的关注点。

从这个元数据到javabean,我需要设置持久性(它是一个使用Objectify的Google App Engine应用程序)并加载其他类并在阅读其中的一些注释时绑定它们。我不想加载资源,所以我想引用从第一个示例加载的资源。

现在,ReflectionsModule还绑定了两个后续模块,我得到(正确)并将它们应用到仅使用第一个模块构建时出现的createChildInjector。就像现在一样,它有效。我只想知道哪种方式最好。

2 个答案:

答案 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()。