Java 将依赖项注入Guice模块

Java 将依赖项注入Guice模块,java,dependency-injection,java-8,guice,Java,Dependency Injection,Java 8,Guice,我有一个模块,用于获取和保存API令牌(简化): 我在尝试访问连接器的线路上出现空指针错误(this.key=connector.getToken(creds);),因此连接器显然没有正确连接 我已经尝试创建一个构造函数并在那里使用@Inject,但是我正在通过new手动将这些模块添加到我的应用程序引导类的列表中,所以这有点过时了 显然,我在这里遗漏了一些东西——在这种情况下,我可能只需要new创建一个TokenConnector,因为它本身没有任何依赖项,但这并不能解决我根本无法理解这里发生了

我有一个模块,用于获取和保存API令牌(简化):

我在尝试访问连接器的线路上出现空指针错误(
this.key=connector.getToken(creds);
),因此连接器显然没有正确连接

我已经尝试创建一个构造函数并在那里使用@Inject,但是我正在通过
new
手动将这些模块添加到我的应用程序引导类的列表中,所以这有点过时了


显然,我在这里遗漏了一些东西——在这种情况下,我可能只需要
new
创建一个
TokenConnector
,因为它本身没有任何依赖项,但这并不能解决我根本无法理解这里发生了什么的问题。因此,如果您想查看(简化的)其他代码片段,或者此代码的简化程度较低的片段,请告诉我。

尽管您不能对模块使用
@Inject
(除非您从另一个注入器获得模块,我强烈建议您不要),但您可以轻松地将其注入@Provides方法

public class KeyHolderModule extends AbstractModule {
    private DateTime keyLastRefreshed;
    private String key;
    private Credentials creds = config.getCreds();

    @Override protected void configure() {}

    @Provides @Named("apiKey") public String getKey(
            TokenConnector connector) {
        // logic to check key last refreshed and handle generating a new one
        this.key = connector.getToken(creds);
        this.keyLastRefreshed = DateTime.now();

        return this.key;
    }
}
这里的诀窍是,模块通常在注入器创建时手动实例化,但是
@提供的方法在需要它们提供的依赖项时被调用。因此,当构建模块时,注入器不准备提供任何东西,但在整个应用程序生命周期中调用的方法可以访问注入器提供的任何其他依赖项。运行
configure
时,喷油器尚未创建,您最好调用
getProvider
(但在喷油器准备就绪之前,您不能调用
get


我还写了许多其他的模块内注入技术。

或者我认为另一种方法是绑定一个密钥提供者,它可以被注入并封装逻辑+返回密钥。这与在guice方面使用@Provides相同吗?@pandaadb我不知道你指的是我不熟悉的任何技术密钥提供程序术语,但我肯定同意这对于一个模块来说有点沉重。如果这是我的代码,我肯定会考虑把它移到<代码>提供者>代码>顶层类,或者是一个随机的POJO,它提供了按需键(这可能是你的意思)。Cheers Jeff -是的,实际上我最终把它移到了另一个类。(,但我对自己所处的环境感到好奇,因为这似乎反映了我对guice的理解存在差距。谢谢你的回答,我会将其标记为已接受。@JeffBowman这正是我的意思:)不是一个技术术语,只是一个提供所需密钥的提供者(密钥提供者:),而不是将它们注入模块中
public class KeyHolderModule extends AbstractModule {
    private DateTime keyLastRefreshed;
    private String key;
    private Credentials creds = config.getCreds();

    @Override protected void configure() {}

    @Provides @Named("apiKey") public String getKey(
            TokenConnector connector) {
        // logic to check key last refreshed and handle generating a new one
        this.key = connector.getToken(creds);
        this.keyLastRefreshed = DateTime.now();

        return this.key;
    }
}