【问题标题】:Guice. Inject into constructor吉斯。注入构造函数
【发布时间】:2016-06-01 05:45:51
【问题描述】:

我有一个单身人士:

public class MySingleton{
  public static getInstance(){//typical singleton getInstance
    ...
  }

  //fields
  private static volatile instance;
  @Inject
  private AnotherClassInstanceThatIWantToInjectHere anotherClassInst_BlaBla;
  private MySingleton(){
    ...
    anotherClassInst_BlaBla.doSmth();//NullPointerException happens!
    ...
  }
}

此 NPE 的原因是什么?这是因为它是构造函数还是因为它是单例?

【问题讨论】:

    标签: java dependency-injection guice


    【解决方案1】:

    anotherClassInst_BlaBla 在这种情况下是一个实例变量,我想这就是你选择 setter 注入的原因。由于它是一个实例变量,并且 setter 注入需要一个实例来将此变量设置为,因此需要创建/构造一个 MySingleton 类的实例以使用 anotherClassInst_BlaBla。

    简而言之,您应该在调用构造函数 MySingleton() 之后调用 doSmth() 方法,因为 setter 注入发生在构造实例之后。

    【讨论】:

    • 不,这不起作用。我不知道为什么,但是当我将作业从构造函数转移到另一个 (init()) 方法时,我仍然有 NPE。
    • 如果你使用initialization block,它仍然会导致NPE,因为初始化块发生在构造函数之前。您可以按照@IvanZelenskyy 的建议使用构造函数注入,或者通过容器注入并添加PostConstructor 方法来调用doSmith() 方法。但问题是,理想情况下,无论哪种方式,您的单例都将不再是单例,因为它具有公共构造函数。任何人都可以创建 MySingleton 类的实例。
    • 我使用@AndyTurner 的回答方式,它可以工作。单例注解并注入构造函数。
    【解决方案2】:

    MySingleton的构造函数被调用时,instance为空。 Guice 必须先构造 MySingleton 的实例,然后才能注入任何东西。

    Guice 有一个单例的概念:要么在模块的单例范围内绑定类,要么将类注解为@Singleton。然后你像往常一样注入:

    @Singleton
    public class MySingleton {
      private AnotherClassInstanceThatIWantToInjectHere anotherClassInst_BlaBla;
    
      @Inject public MySingleton(AnotherClassInstanceThatIWantToInjectHere anotherClassInst_BlaBla) {
        this.anotherClassInst_BlaBla = anotherClassInst_BlaBla;
        anotherClassInst_BlaBla.doSmth();
      }
    }
    

    【讨论】:

    • 好的,但这是什么意思?我无法访问构造函数中的注入字段?
    猜你喜欢
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2011-01-11
    相关资源
    最近更新 更多