gpt4 book ai didi

java - Guice log4j 自定义注入(inject)不支持在构造函数内进行日志记录

转载 作者:行者123 更新时间:2023-11-30 05:56:49 27 4
gpt4 key购买 nike

我正在尝试使用 Guice 将 Log4J Logger 实例注入(inject)到类中,如 Guice 文档中所述:

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

但是,正如该 wiki 页面上的一些评论所述,该方案不支持构造函数注入(inject)。所以我不能这样做:

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");
}
}

是否有另一种方法来处理此注入(inject),以便及时注入(inject)记录器以供构造函数使用?

最佳答案

感谢 jfpoilpret 的帮助,我能够得到我想要的行为。当 Logger 变量修改为静态时,我在hear() 中使用了条件来利用反射,否则它使用正常的 Guice 字段注入(inject)。

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);
}
}
}
}

关于java - Guice log4j 自定义注入(inject)不支持在构造函数内进行日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6604071/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com