我有以下类(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();
}
}
最佳答案
dataLoader
为 null
,因为它尚未初始化
您请求注入(inject)一个字段,但您尝试在它初始化之前调用它。
按顺序执行什么?
- 字段的直接分配。这意味着
private double pi = 3.14;
- 构造函数。
- 构造函数之外的所有内容
你必须明白Guide是在构造函数之外的,甚至是@Inject
。当您实例化一个对象时,首先调用其构造函数,然后注入(inject)字段。这就像在 Spring 或 Java EE 中:初始化是使用另一种方法完成的,在 @PostConstruct
中注释。然而Guide没有这样的注释。
解决您问题的解决方案是
- 您可以将字段作为构造函数参数注入(inject),以便可以在构造函数期间进行初始化,或者
- 创建 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/