Как я могу использовать внедрение зависимостей в приложении 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 по умолчанию

Другие вопросы по тегам