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