#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();
}