java - 应用程序初始化后如何调用类中的方法?
问题描述
我有如下课程。我希望在初始化应用程序或 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();
}
}
解决方案
dataLoader
是null
因为还没有初始化
您请求注入一个字段,但您尝试在它初始化之前调用它。
按顺序执行什么?
- 字段的直接分配。这表示
private double pi = 3.14;
- 构造函数。
- 构造函数之外的所有内容
您必须了解 Guide 在构造函数之外,甚至@Inject
. 当您实例化一个对象时,首先调用其构造函数,然后注入字段。就像在 Spring 或 Java EE 中一样:初始化是使用另一种方法完成的,在@PostConstruct
. 但是指南没有这样的注释。
所以解决你的问题的解决方案是
- 要么将字段作为构造函数参数注入,以便在构造函数期间进行初始化,要么
- 创建 Injector 后,您将获取实例并调用
@PostConstruct
您创建的类似方法。
例子:
Injector injector = Guice.createInjector(...);
DataService dataService = injector.getInstance(DataService.class);
dataService.init();
你DataService
的如下:
class DataService {
@Inject DataLoader loader;
void init() {
loader.load();
}
}
推荐阅读
- scala - 如何在条件表达式保存在数据框列中的火花数据框上应用条件表达式过滤器
- neo4j - Neo4J 不显示选定的边缘
- amazon-web-services - 当多个 DynamoDB 客户端删除特定项目时,每个客户端(如何)确定他们的 DeleteItem 调用是否有意义?
- c# - 在链接到 ID 的 MVC .net 核心中选择组合框
- javascript - 如何删除项目并刷新js中的下拉值列表
- c++ - 在 C++ 中使用 cin 在 int 变量中输入 char 和 int
- spring-webflux - 事务同步:如何使用 Reactor Kafka 和 R2DBC 创建 ChainedKafkaTransactionManager bean
- css - 使用 alpinejs 进行滑块转换
- java - 用于下载多个文件的 Aws S3 预签名 URL
- php - 获取产品图库的图片编号 x 代替原始产品图片