не может внедрить зависимость в проекте javafx - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь выполнить внедрение зависимостей в проекте javaFX.

У меня есть

@Singleton
public class WidgetFactory implements IWidgetFactory

Мой public class ZentaEditorModule extends MvcFxModule содержит

  @Override
  protected void configure() {
    super.configure();
    //some other code
    System.out.println("binding WidgetFactory");
    bind(IWidgetFactory.class).to(WidgetFactory.class);
  }

В моем public class ZentaApplication extends Application У меня есть это, работает при инициализации приложения:

final Injector injector = Guice.createInjector(module);
System.out.printf(
    "widgetFactory=%s\n", injector.getInstance(IWidgetFactory.class)
);
domainHandler = new DomainHandler(injector, editorModel);

И DomainHandler запускается так:

public class DomainHandler {

  @Inject
  private IWidgetFactory widgetFactory;
  @Inject
  private Injector injector;

  public DomainHandler(
      final Injector injector, final EditorModelItem editorModelItem
  ) {
    System.out.printf(
        "injector in domainHandler=%s\n",
        injector
    );
    System.out.printf(
        "injector2 in domainHandler=%s\n",
        getInjector(null)
    );
    System.out.printf(
        "widgetFactory in domainHandler=%s\n",
        widgetFactory
    );
    System.out.printf(
        "injector parameter=%s\n",
        this.injector
    );
 }
  @Inject
  public Injector getInjector(final Injector injector) {
    return injector;
  }
}

И я получил это:

binding WidgetFactory
widgetFactory=org.rulez.demokracia.zenta3.editor.widgets.WidgetFactory@39957a81
injector in domainHandler=Injector[bindings=[ProviderInstanceBinding[key=Key[type=com.google.inject.Injector...
injector2 in domainHandler=null
widgetFactory in domainHandler=null
injector parameter=null
DomainHandler constructor

Вывод инжектора на самом деле содержит это:

LinkedKeyBinding[key=Key[type=org.rulez.demokracia.zenta3.editor.widgets.IWidgetFactory,
 annotation=[none]],
 source=org.rulez.demokracia.zenta3.editor.ZentaEditorModule.configure(ZentaEditorModule.java:152),
 scope=Scopes.NO_SCOPE,
 target=Key[type=org.rulez.demokracia.zenta3.editor.widgets.WidgetFactory,
 annotation=[none]]],

Из этого кажется, что в мой экземпляр DomainManager ничего не вводится, ни в одной из аннотаций @Inject.Интересно, что в коде есть другие классы, в которые также вводится инжектор, и они работают.Так что, думаю, я что-то не так делаю при инициализации.Но что?

1 Ответ

2 голосов
/ 17 апреля 2019

Вы не создаете свой обработчик домена с помощью guice, и поэтому аннотации @inject ничего не делают. Если вы хотите создать этот объект в обоих направлениях, просто используйте инжектор конструктора и удалите @inject из ваших полей.

@inject
public DomainHandler(Injector injector, WidgetFactory widgetFactory) {
    this.injector = injector;
    this.widgetFactory = widgetFactory 
} 

Таким образом, передача их вручную или использование getInstance сделают то же самое.

@ Вводить на получателях не имеет смысла, его можно использовать на получателях, но даже в документах это говорит не нормально, и вы передаете его как ноль, когда вы печатаете его из вашего конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...