我使用谷歌 - 吉斯因为一两天,而我越来越深刻的印象。
我创建了一个MemberInjector轻松整合日志框架SLF4J,只是一个额外的注释。也就是说,而是采用总是从长远来看:
private static final Logger LOG = LoggerFactory.getLogger(MyClass.class);
我现在只是用:
@Log
Logger LOG;
这真是太好了,但是: 我也使用的方法注射作为一种像这样在同一类起动器的功能,如果我访问日志实例有,它会导致NPE!因为它尚未注入。
@Inject
public void start() {
//And here is the problem...
LOG.info("in start") //causes NPE, cause LOG is not injected yet
}
如果我使用LOG例如在它完美另一个(非注射)方法,。
有没有办法来改变喷射顺序或是否有可能告诉吉斯较早注入MemberInjector?因为我真的想也使用日志的方法注入部分。
感谢任何提示。
一个解决方案,我发现是创建只是一个额外的监听器,看起来像一个定义的方法(“初始化”或“开始”),并创建和成员的注射后只需调用它。
请参阅模块配置:
@Override
protected void configure() {
bindListener(Matchers.any(), new InitMethodTypeListener());
//...
InitMethodTypeListener:
public class InitMethodTypeListener implements TypeListener {
private static final Logger log = LoggerFactory.getLogger(InitMethodTypeListener.class);
@SuppressWarnings("rawtypes")
static class InitInvoker implements InjectionListener {
@Override
public void afterInjection(final Object injectee) {
try {
log.info("Invoke init() from Class: {}", injectee.getClass().getName());
injectee.getClass().getMethod("init").invoke(injectee);
} catch (final Exception e) {
log.error(e.getMessage(), e);
}
}
public static final InitInvoker INSTANCE = new InitInvoker();
}
@SuppressWarnings("unchecked")
@Override
public <I> void hear(final TypeLiteral<I> type, final TypeEncounter<I> encounter) {
try {
if (type.getRawType().getMethod("init") != null) {
encounter.register(InitInvoker.INSTANCE);
}
} catch (final NoSuchMethodException | SecurityException e) {
// do nothing here, if not init-method found - no call
}
}
}
也许它不是直接的方式,但它的工作原理。所以我相信,所有成员都注入以及当初始化方法被调用。
有了这个实现是在吉斯所有对象控制自己的“初始化” - 方法会自动创建对象和注射后调用。