“MembersInjector”和常规“方法” - 注射错误的注射顺序?

问题描述 投票:0回答:1

我使用谷歌 - 吉斯因为一两天,而我越来越深刻的印象。

我创建了一个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?因为我真的想也使用日志的方法注入部分。

感谢任何提示。

java guice
1个回答
0
投票

一个解决方案,我发现是创建只是一个额外的监听器,看起来像一个定义的方法(“初始化”或“开始”),并创建和成员的注射后只需调用它。

请参阅模块配置:

@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
        }
    }
}

也许它不是直接的方式,但它的工作原理。所以我相信,所有成员都注入以及当初始化方法被调用。

有了这个实现是在吉斯所有对象控制自己的“初始化” - 方法会自动创建对象和注射后调用。

© www.soinside.com 2019 - 2024. All rights reserved.