在没有主要方法的情况下使用Guice

时间:2010-09-29 12:28:02

标签: java singleton guice

我正在创建一个将作为jar包含的库,因此它不包含main方法。我想知道在这种情况下引导Guice的最佳做法是什么。我有一个顶级单身人士。

public class TestManager
{
    private TestManager()
    {
    }

    public static TestManager getInstance()
    {
        // construct and return singleton
    }

    public void createSomeObjects()
    {
    }

}

我应该在哪里引导Guice?我想在构造函数中我可以调用Guice.createInjector(new Module());但它不会注入createSomeObjects()中创建的任何对象。

当你没有main方法()时,有没有一种常见的方法呢?

干杯。

3 个答案:

答案 0 :(得分:8)

就像记录配置一样,如果这是一个真正的库,那么你的选择就是这样:

  • 告诉图书馆用户他们自己负责引导Guice。
  • 提供库初始化方法,如果他们想要使用您的库,则负责引导Guice

尝试使图书馆超级聪明地进行自我配置通常会导致一些不灵活,难以测试的类层次结构。

答案 1 :(得分:1)

如果您只是在库的范围内使用Guice而不是整个应用程序,那么您可以在TestManager类中使用静态块。

此策略假设应用程序将在某个时刻调用TestManager.getInstance(),并且它是进入API的唯一入口点。

@Singleton
class TestManager {

  private static final TestManager INSTANCE;

  static {
    INSTANCE = Guice.createInjector(new Module()).getInstance(TestManager.class);
  }

  private TestManager() {
  }

  public static TestManager getInstance() {
      return INSTANCE;
  }

  @Inject
  public void createSomeObjects(YourDependencies ...) {
     // Do something with dependencies
  }
}

答案 2 :(得分:0)

这不是所做的,而是你可以做的事情:

让库中的键类扩展或以其他方式引用初始化静态块中所有内容的类。这是一个非常脏的黑客攻击,但是如果你确保在没有加载你的初始化程序类的类加载器的情况下无法访问你的api,那么你应该是安全的。

如果你使用了AspectJ并将初始化类型的私有成员注入到库中的所有类中(没有触及java代码),你可以使它更清洁,但它仍然是一个黑客。