繁体   English   中英

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

[英]How to call a method in a class after the application has been initalized?

我有如下课程。 我希望在应用程序或 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();
    }
}

dataLoadernull因为它尚未初始化

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

依次执行什么?

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

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

因此,解决您的问题的解决方案是

  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();
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM