首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用guice进行注入

无法使用guice进行注入
EN

Stack Overflow用户
提问于 2015-05-20 09:11:15
回答 2查看 1.5K关注 0票数 1

我有一个归档类,其结构如下:

代码语言:javascript
复制
public class Archive implements Tasklet, StepExecutionListener{

    @Inject
    private Configuration configuration;
    public static final String FF = "ff";

    @Override
    public RepeatStatus execute(StepContribution arg0, ChunkContext arg1)
            throws Exception {

        System.out.println("in execute method :)");
        return RepeatStatus.FINISHED;
    }


    @Override
    public ExitStatus afterStep(StepExecution arg0) {
        return ExitStatus.COMPLETED;
    }

    @Override
    public void beforeStep(StepExecution arg0) {
        JobExecution jobExecution = arg0.getJobExecution();
         ExecutionContext jobContext = jobExecution.getExecutionContext();
         Properties properties = configuration.getPrefixProperties(FF);
         filePath =  properties.getProperty("fd.folder");
         fileName = "test.csv";

    }
}

我的活页夹类如下:

代码语言:javascript
复制
@Singleton
public class EWM extends AbstractModule {

    @Inject
    private static Injector injectorInstance;

    private static final EWM instance = new EWM();

    public static final EWM getInstance() {
        return instance;
    }

    public static Injector getInjector() {
        return injectorInstance;
    }

    public EWM() {
    }

    @Override
    protected void configure() {    
        bind(Archive.class);
        requestInjection(LoggingAspect.class);  
    }
}

我正在获得空配置对象。我不知道为什么配置是空的。谁能帮我找出原因。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-20 13:54:16

你的问题中没有足够的信息来回答它,但我可以给你一些关于去哪看的建议。

Guice试图阻止null的注入,所以Archive很可能根本没有被注入。有几个原因可能会发生:

  • 存档有一个@Inject构造函数,它不设置configuration字段
    • 如果可以的话,Guice可能会选择注入这个构造函数而不是@Inject字段。从构造函数中删除@Inject注释。

  • 实例化档案的人不是Guice。
    • 您是否使用Injector#getInstance()直接实例化存档,它是否是由注入器实例化的某个域上的一个域?

票数 2
EN

Stack Overflow用户

发布于 2015-06-16 19:58:31

我怀疑configuration为null的原因是因为类不是由Guice创建的。

为了防止这种情况,为设计由Guice创建的类提供了包范围或私有构造函数

代码语言:javascript
复制
public class Archive implements Tasklet, StepExecutionListener {
  private static final String FF = "ff";
  private final Configuration configuration;

  @Inject
  Archive(Configuration configuration) {
    this.configuration = configuration;
  }

  ...

我选择了包范围构造函数,因为我希望为类编写单元测试(参见下面的说明)。

如果您想让Archive成为单例,请用@Singleton注释类。

下面是上述类的一个简单模块:

代码语言:javascript
复制
public class ArchiveModule extends AbstractModule {

  @Override
  protected void configure() {
    bind(Archive.class);
  }
}

bind()调用并不是真正需要的--模块实际上也不需要--但是我喜欢使用它,所以我知道如果模块安装了,如果不能为Archive类创建依赖项,Guice会在注入器创建时出现错误。

在您的主目录中,将有如下代码:

代码语言:javascript
复制
Main main = Guice.createInjector(
    new ArchiveModule(),
    new AnotherModule(),
    ... );
main.run();

一些注意事项:

  • 在模块中添加@Singleton没有效果,因为Guice没有构造模块;要求Guice创建注入器的代码通常会构造模块。
  • 类似地,您的模块没有注入,因此您的模块的injector字段将永远不会被设置(除非您请求模块上的静态注入,但我强烈建议不要这样做)
  • 与字段注入相比,更喜欢构造函数注入,因此1)您的字段可以是最终的;2)您可以编写单元测试,无需使用Guice创建对象;2)如果没有Guice,很难在生产代码中意外地创建类。
  • 我建议不要对类名使用缩写,除非缩写是众所周知的。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30345223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档