Интерфейс с именем inject в нетерпеливом синглтоне

#java #dependency-injection #singleton #guice #inject

#java #внедрение зависимостей #синглтон #интерфейс #ввод

Вопрос:

Существует класс 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 в:

 public class BootstrapServletModule extends ServletModule {

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

Иногда, когда запускается Tomcat, я получаю правильно введенное значение в MY_LISTENER_PORT, например: «Порт: 9999». Иногда он не вводится, и я получаю «Порт: 0». Почему это происходит?

Ответ №1:

Это может быть просто, что ваш конструктор срабатывает до того, как «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();
    }