Почему @Inject @Singleton в Java всегда приводит к нулю при использовании Guice? - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь реализовать простейшую из возможных Java-программ, в которой объект @Singleton вводится через @Inject.Однако после @Inject объект всегда null.

Я понял, что мне нужно использовать Guice для привязки определенного поведения.Я делаю это через MyGuiceModule, что extends AbstractModule.Однако MyGuiceModule никогда не вызывали, поэтому мне пришлось добавить эту строку:

Injector injector = Guice.createInjector(new MyGuiceModule());

Но это не работает.Вот мои файлы:

LonelyObject

import javax.inject.Inject;
import javax.inject.Singleton;

@Singleton
public class LonelyObject {
    public LonelyObject() {
        System.out.println("LonelyObject Constructor");
    }

    public void alive() {
        System.out.println("I AM ALIVE");
    }
}

TheTest

public class TheTest {
    // inject LonelyObject here
    @Inject
    LonelyObject L;

    public TheTest() {
    }

    // use LonelyObject
    public void doit() {
        L.alive();
    }
}

MyGuiceModule

import com.google.inject.AbstractModule;
import com.google.inject.Singleton;

import javax.inject.Inject;

public class MyGuiceModule extends AbstractModule {
    @Override
    protected void configure() {
        System.out.println("MyGuiceModule extends AbstractModule");

        // make sure LonelyObject is always instantiated as a singleton
        bind(LonelyObject.class).asEagerSingleton();
    }
}

основная функция

public static void main(String[] args) {
    System.out.println("main");

    // this is only here so MyGuiceModule gets called, otherwise
    // it will be ignored. this seems to be the only way I can see
    // to configure Guice. note that the returned Injector is not used.
    Injector injector = Guice.createInjector(new MyGuiceModule());

    TheTest t = new TheTest();

    // crashes here with Exception in thread "main" java.lang.NullPointerException
    t.doit();
}

1 Ответ

0 голосов
/ 17 октября 2018

Вы полностью обойдете Guice.

На самом деле виновником является следующая строка:

TheTest t = new TheTest();

Вы не должны создавать свой экземпляр самостоятельно.Вместо этого попросите Guice создать его для вас:

TheTest t = injector.getInstance(TheTest.class);

В качестве альтернативы можно попросить Guice ввести поля непосредственно в ваш экземпляр для вас (но это рекомендуется только при интеграции устаревших библиотек):

TheTest t = new TheTest();
injector.injectMembers(t);
...