Надеюсь, вы поймете, что я имею в виду под вопросом, если я объясню контекст того, что я хочу сделать: Я пытаюсь использовать Кинжал с библиотекой Gluon Ignite в моем проекте JavaFX.Как запросить экземпляры, управляемые кинжалом, только с помощью аннотации @Inject во всех классах?
Моя настройка немного странная:
У меня есть проект EJB, содержащий несколько классов, которые должны совместно использоваться клиентами. Он содержит два класса, аннотированные с @Stateless и @Singleton, поэтому они развертываются как EJB на сервере приложений. Я хочу использовать классы модуля EJB из автономного приложения JavaFX. Таким образом, клиент JavaFX должен работать без EJB, развернутых на сервере приложений.
Для этого я сказал gradle, чтобы упаковать классы EJBs в приложении JavaFX. Модуль EJB также является частью проекта EAR, который создается посредством многопроектной сборки gradle, чтобы сделать его доступным для развертывания. Построение JavaFX не зависит от модуля EAR и многопроектной конфигурации. Теперь я хочу использовать Кинжал (Gluon Ignite), чтобы внедрить сервисы из модуля EJB. Если возможно, я не хочу «переуступать» классы EJB с любым кодом, предназначенным для кинжалов, чтобы все еще иметь возможность развертывать его как стандартный модуль EJB. Также EJB должны иметь возможность запрашивать экземпляры друг друга. Я не могу поверить, что это не сработало, поскольку Кинжал основан на стандартных аннотациях JSR-330.
Я получил инъекцию работает только из моего класса Application, добавив
private final DIContext context = new DaggerContext(this,() -> Arrays.asList(new DaggerApplicationModule()));
@Inject
GlobalService globalService;
Я написал один модуль кинжала, который содержит только поставщик для класса, который должен вводиться через интерфейс. Для других классов я добавил @Inject в свой конструктор без аргументов. Насколько я понимаю, вызов метода context.init();
(принадлежащий Gluon Ignite) в методе запуска класса приложения вызывает инжекцию поля. В отличии от этого я понял, что один из способов разрешения зависимостей в других классах, чем мой класс Приложения вручную писать что-то вроде этого:
ObjectGraph og = ObjectGraph.create(new DaggerApplicationModule());
globalService = og.get(GlobalService.class);
В противном случае, по аннотированию поля с @Inject, они остаются нулевыми , Для меня это выглядит как раздражающий шаблонный код, который я бы не хотел иметь в своих классах EJB. Должен ли я писать что-то подобное вручную? Может быть, я ошибаюсь.
Ну, конечно, я сделал пробную версию и ошибку с атрибутом injects. В моей конфигурации единственным классом, требуемым компилятором, является класс приложения. Для моего понимания было бы также разумно рассказать кинжалу о классе ViewController, поскольку он является точкой входа ObjectGraph и не создан самим кинжалом, но, к сожалению, это не имеет никакого значения. – MannikJ