【问题标题】:Using Guice without a main method在没有 main 方法的情况下使用 Guice
【发布时间】:2011-04-18 19:18:33
【问题描述】:

我正在创建一个将作为 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 方法()时,有没有一种常用的方法来做到这一点?

干杯。

【问题讨论】:

    标签: java singleton guice


    【解决方案1】:

    很像日志配置,如果这是一个真正的库,那么您的选择几乎是这样的:

    • 告诉库用户他们自己负责引导 Guice。
    • 提供一个库初始化方法,如果他们想使用您的库,该方法负责引导 Guice

    试图让库超级智能以进行自我配置通常会以有些不灵活、难以测试的类层次结构告终。

    【讨论】:

    • +1 超智能自配置。想想 Apache Commons Logging 的糟糕表现。
    • @Jesse,我从未见过在内部使用 Guice 的库实际上将其公开给最终用户。例如,Maven 和 JIRA 在幕后使用 IoC,但它们会在您不知道它们使用哪种实现的情况下注入到您的类中。暴露 Guice 听起来更干净(如果用户对 Guice 感到满意),但我担心它可能会吓跑用户(为什么没有其他人这样做?)。
    【解决方案2】:

    如果您只是在库的范围内使用 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
      }
    }
    

    【讨论】:

      【解决方案3】:

      这不是你应该做的,而是你可以做的:

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

      如果您使用 AspectJ 并将初始化器类型的私有成员注入到库中的所有类中(不接触 java 代码),您可以让它更简洁一些,但它仍然是一个 hack。

      【讨论】:

        猜你喜欢
        • 2012-01-26
        • 2012-11-18
        • 2018-04-18
        • 1970-01-01
        • 2018-07-15
        • 2017-10-03
        • 2015-01-08
        • 1970-01-01
        • 2023-04-03
        相关资源
        最近更新 更多