Как я могу использовать внедрение зависимостей в приложении Gluon Desktop?
Кто-нибудь знает, есть ли какой-нибудь простой способ использовать внедрение зависимостей в контроллерах FXML приложения Gluon Desktop (ParticleApplication)? Уже используется @Inject для таких вещей, как
public class HomeController {
@Inject ParticleApplication app;
@Inject private ViewManager viewManager;
@Inject private StateManager stateManager;
(как часть фреймворка), но я бы хотел иметь возможность вводить свои собственные объекты.
РЕДАКТИРОВАТЬ: Ответ предложил использовать Gluon Ignite, но я все еще не могу понять это. Вот некоторые из моих попыток кода:
Мой класс ParticleApplication:
package com.gluonapplication;
import com.gluonhq.ignite.guice.GuiceContext;
import com.gluonhq.particle.application.ParticleApplication;
import com.google.inject.AbstractModule;
import javafx.scene.Scene;
import java.util.Arrays;
public class GluonApplication extends ParticleApplication {
private GuiceContext context = new GuiceContext(this, () -> Arrays.asList(new GuiceModule()));
public GluonApplication() {
super("Gluon Desktop Application");
context.init();
System.out.println("From within GluonApplication Constructor: " +
context.getInstance(TestClassToInject.class).testDependancy.testString
);
}
@Override
public void postInit(Scene scene) {
setTitle("Gluon Desktop Application");
}
class GuiceModule extends AbstractModule {
@Override protected void configure() {
// Use just in time injection.
}
}
}
Мой класс контроллеров:
package com.gluonapplication.controllers;
import com.gluonapplication.TestClassToInject;
import com.gluonhq.particle.application.ParticleApplication;
import com.gluonhq.particle.state.StateManager;
import com.gluonhq.particle.view.ViewManager;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javax.inject.Inject;
public class PrimaryController {
@Inject ParticleApplication app;
@Inject private ViewManager viewManager;
@Inject private StateManager stateManager;
@Inject private TestClassToInject testClassToInject;
@FXML
private Label label;
public void initialize() {
}
public void postInit() {
System.out.println("From within controller's postInit() method: " +
testClassToInject.testDependancy.testString
);
}
public void dispose() {
}
}
И тогда мои два класса созданы как зависимости:
package com.gluonapplication;
import javax.inject.Inject;
public class TestClassToInject {
@Inject
public TestDependancy testDependancy;
public TestClassToInject() {
}
}
package com.gluonapplication;
public class TestDependancy {
public String testString = "This is a test string";
public TestDependancy() {
}
}
И наконец мой файл Gradle:
apply plugin: 'java'
apply plugin: 'application'
repositories {
jcenter()
maven {
url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
}
}
mainClassName = 'com.gluonapplication.GluonApplication'
dependencies {
compile 'com.gluonhq:particle:1.1.0'
compile 'com.gluonhq:ignite-guice:1.0.0'
}
"From within GluonApplication Constructor: " +
context.getInstance(TestClassToInject.class).testDependancy.testString
распечатывает просто отлично, так что я думаю, что у меня есть классы зависимости, и Guice настроен хорошо. Тем не менее System.out.println("From within controller's postInit() method: " + testClassToInject.testDependancy.testString);
не работает изнутри контроллера, потому что testClassToInject
является нулевым во время использования.
1 ответ
Вы можете использовать Gluon Ignite ( http://gluonhq.com/open-source/ignite/), который поддерживает внедрение зависимостей с помощью Dagger, Guice и Spring. Gluon Ignite является проектом с открытым исходным кодом, и вы можете найти пример в тестовом каталоге на веб-сайте хранилища: https://bitbucket.org/gluon-oss/ignite/src/c85197b33852/src/test/java/com/gluonhq/ignite/?at=default по умолчанию