java - 应用程序初始化后如何调用类中的方法?

标签 java guice

我有以下类(class)。我想 在初始化应用程序或 DataService 类之后、初始化 DataHandler 之前,DataService 构造函数中的语句将被调用。但构造函数中 dataLoader 对象为 null。我是 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();
    }
}

最佳答案

dataLoadernull,因为它尚未初始化

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

按顺序执行什么?

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

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

解决您问题的解决方案是

  1. 您可以将字段作为构造函数参数注入(inject),以便可以在构造函数期间进行初始化,或者
  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();
  }
}

关于java - 应用程序初始化后如何调用类中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57503517/

相关文章:

java - JVM后台运行什么

java - 使用 java 从 Maven 多模块项目创建 war 文件失败

java - 具有可配置具体类的 Guice 模块

java - 将依赖项注入(inject) Guice 模块

java - 无法使用 RSA 公钥(使用 bouncycaSTLe 创建的 PEM 文件)来加密文件

java - Selenium webdriver 不退出 chrome 驱动程序

java - 尝试使用 iText 生成可变页面 PDF 时出现异常

java - 在 com.google.inject.AbstractModule#configure(com.google.inject.Binder) 开头检查 null 状态的目的是什么

java - Eclipse - Google Guice

java - Jersery1.x、Guice 和 Tomcat 的问题