Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 初始化应用程序后,如何在类中调用方法?_Java_Guice - Fatal编程技术网

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

Java 初始化应用程序后,如何在类中调用方法?,java,guice,Java,Guice,我的课程如下。我想要 在初始化应用程序或DataService类之后,在初始化DataHandler之前,将调用DataService构造函数中的语句。但是dataLoader对象在构造函数中为null。我是guice的新手,想知道如何使用guice实现这一点 @Singleton @Managed class DataService{ @Inject private DataLoader dataLoader; DataService(){ dataLoader.

我的课程如下。我想要 在初始化应用程序或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();
    }
}
dataLoader
null
,因为它尚未初始化 您请求一个字段的注入,但在初始化之前尝试调用它

按顺序,执行什么

  • 字段的直接赋值。这意味着
    private double pi=3.14
  • 构造器
  • 构造器之外的一切
  • 您必须了解该指南在构造函数之外,甚至
    @Inject
    。实例化对象时,首先调用其构造函数,然后注入字段。就像在Spring或JavaEE中一样:初始化是使用另一种方法完成的,在
    @PostConstruct
    中进行注释。然而,指南并没有这样的注释

    所以解决你问题的方法是

  • 要么将字段作为构造函数参数注入,以便在构造函数期间进行初始化,要么
  • 创建注入器后,获取实例并调用其创建的类似于
    @PostConstruct
    的方法
  • 例如:

    Injector injector = Guice.createInjector(...);
    DataService dataService = injector.getInstance(DataService.class);
    dataService.init();
    
    您的
    DataService
    如下所示:

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

    为什么不在构造器中这样做呢?我试过了。即使绑定后没有调用constructor,您可以检查
    @Inject
    注释的导入语句吗?我了解到,根据与Guice一起使用的内容,您需要从
    javax.Inject.Inject
    而不是Guice导入它。。。值得一试