Guice log4j настраиваемая инъекция не поддерживает ведение журнала в конструкторе - PullRequest
2 голосов
/ 07 июля 2011

Я пытаюсь использовать Guice для внедрения экземпляров Log4J Logger в классы, как описано в документации Guice:

http://code.google.com/p/google-guice/wiki/CustomInjections

Однако, как отмечалось в некоторых комментариях на этой вики-странице, эта схема не поддерживает внедрение в конструктор. Поэтому я не могу сделать это:

public class Foo {
    @InjectLogger Logger logger;

    @Inject
    public Foo(<injected parameters>) {
        logger.info("this won't work because logger hasn't been injected yet");
        ...
    }

    public bar() {
        logger.info("this will work because by the time bar() is called,")
        logger.info("the logger has been injected");
    }
}

Есть ли другой способ обработать эту инъекцию так, чтобы регистратор вводился вовремя для использования конструктором?

1 Ответ

6 голосов
/ 12 июля 2011

Благодаря помощи jfpoilpret я смог получить желаемое поведение.Я использовал условное выражение в listen (), чтобы усилить отражение, когда переменная Logger изменена как статическая, в противном случае она использует обычное внедрение поля Guice.

public <T> void hear(TypeLiteral<T> typeLiteral, TypeEncounter<T> typeEncounter) {  
    for (Field field : typeLiteral.getRawType().getDeclaredFields()) {
        if (field.getType() == Logger.class && field.isAnnotationPresent(InjectLogger.class)) {
            if (Modifier.isStatic(field.getModifiers())) {
                // use reflection
                try {
                    field.setAccessible(true);
                    Logger logger = Logger.getLogger(field.getDeclaringClass());
                    field.set(null, logger);
                } catch (IllegalAccessException iae) { }
            } else {
                // register a member injector 
                Log4JMembersInjector<T> memberInjector = new Log4JMembersInjector<T>(field);
                typeEncounter.register(memberInjector);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...