首页 > 解决方案 > 应用程序初始化后如何调用类中的方法?

问题描述

我有如下课程。我希望在初始化应用程序或 DataService 类之后和初始化 DataHandler 之前调用 DataService 的构造函数中的语句。但是 dataLoader 对象在构造函数中为空。我是 guice 新手,想知道如何使用 GUICE 实现这一目标

@Singleton
@Managed
class DataService{

    @Inject private DataLoader dataLoader;

   DataService(){
      dataLoader.load(); // I am trying to udnerstand why dataLoader is null?
   }
}

@Singleton
@Managed
class DataHandler{

    @EventHandler
    public void handle(StaticData data){
       //some logic om data
    }
}

Class StaticDataModule extends AbstractModule{

    @Override
    protected void configure(){
        bind(DataService.class).asEagerSingletin();
        bind(DataHandler.class).asEarSingleton();
    }
}

标签: javaguice

解决方案


dataLoadernull因为还没有初始化

您请求注入一个字段,但您尝试在它初始化之前调用它。

按顺序执行什么?

  1. 字段的直接分配。这表示private double pi = 3.14;
  2. 构造函数。
  3. 构造函数之外的所有内容

您必须了解 Guide 在构造函数之外,甚至@Inject. 当您实例化一个对象时,首先调用其构造函数,然后注入字段。就像在 Spring 或 Java EE 中一样:初始化是使用另一种方法完成的,在@PostConstruct. 但是指南没有这样的注释。

所以解决你的问题的解决方案是

  1. 要么将字段作为构造函数参数注入,以便在构造函数期间进行初始化,要么
  2. 创建 Injector 后,您将获取实例并调用@PostConstruct您创建的类似方法。

例子:

Injector injector = Guice.createInjector(...);
DataService dataService = injector.getInstance(DataService.class);
dataService.init();

DataService的如下:

class DataService {
  @Inject DataLoader loader;
  void init() {
    loader.load();
  }
}

推荐阅读