Какова правильная идиома для использования встроенного Guice Injection для аннотирования статических экземпляров java.util.Logger? - PullRequest
3 голосов
/ 05 мая 2011

Я хочу начать использовать Guice 3.x для магического внедрения моих java.util.logging.Logger экземпляров.

Вот фрагмент кода, который я пытаюсь заставить работать:

@Singleton
public class Main
{
    @Inject
    private static final Logger logger;

...
}

Это не похоже на работу.

Я получаю Exception in thread "main" java.lang.NullPointerException независимо от того, какую область я использую в объявлении.

Я добавил строку super.requestStaticInjection(Main.class); к своему module в методе configure(), и он начал работать, но только если я удалю ключевое слово final и сделаю его static Logger logger.

Я бы предпочел сохранить Logger final, если это вообще возможно.

Каков правильный идиоматический способ Guice сделать это?

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Вы можете ввести в статические свойства, например, с помощью

class Dummy {
   @Inject static Foo;
}

и

requestStaticInjection(Dummy.class);

в форсунке configureModule.

0 голосов
/ 19 февраля 2013

Guice разрешает разрешать финальные инъекции поля, однако это не рекомендуется

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

source , также можно использовать все предостережения set () .

Это означает, что может быть введено конечное поле, но не может быть вставлено статическое конечное поле .

Если базовое поле является окончательным, метод вызывает исключение IllegalAccessExceptionесли setAccessible (true) не удалось для этого поля и это поле нестатично.

С другой стороны, JSR 330 не позволяет вводить конечные поля.

...