Guice在渴望的单身人士中命名注入

时间:2016-10-12 13:17:17

标签: java dependency-injection singleton guice inject

Java类应该具有int MY_LISTENER_PORT,并从属性文件中注入my.listener.port值:

@Singleton
public class MyListener {

    @Inject
    @Named("my.listener.port")
    private int MY_LISTENER_PORT;

    public MyListener(){
        start();
    }

    public void start() {
        System.out.println("Port: " + MY_LISTENER_PORT);
    }
}

在Guice中与Guice单独绑定:

public class BootstrapServletModule extends ServletModule {

     @Override
     protected void configureServlets() {
          ...
          bind(MyListener.class).asEagerSingleton();
          ...
     }
}

有时当Tomcat启动时,我会正确地将值注入MY_LISTENER_PORT,例如:" Port:9999"。有时,它没有注入,我得到了#34; Port:0"。为什么会这样?

1 个答案:

答案 0 :(得分:4)

这可能只是构造函数在“MY_LISTER_PORT”之前发生的事情。有机会被注射

https://github.com/google/guice/wiki/InjectionPoints

https://github.com/google/guice/wiki/Bootstrap

构造函数在方法和字段之前注入,因为您必须在注入其成员之前构造实例。

  

注射按特定顺序进行。注入所有字段   然后是所有方法。在字段内,注入了超类型字段   在子类型字段之前。类似地,注入超类型方法   在子类型方法之前。

用户构造函数注入

@Inject
public MyListener(@Named("my.listener.port") int port){
        this.MY_LISTER_PORT = port;
        start();
    }