Guice 在 VertX 中注入

Guice Inject in VertX

我在具有多个访问数据库的 Verticle 的 VertX 应用程序上编写。每个数据库包代表一个 java-class。这些 classes 中的每一个都可以实现为单例 class.

我做了一个小案例:2 个 Verticle,它们使用 database.doLoginUser。

package testInject;

import io.vertx.core.DeploymentOptions;
import io.vertx.core.Vertx;


public class App {

    public static void main(String[] args) {
        Vertx vertx = Vertx.vertx();
        DeploymentOptions options = new DeploymentOptions().setWorker(true).setInstances(5);
        vertx.deployVerticle("java:testInject.Test1",options);
        vertx.deployVerticle("java:testInject.Test2",options);
    }
}
package testInject;

import com.google.inject.Inject;

public class Test1 extends MyVerticle {
 
    // @Inject
    Database     db = new Database();

    @Override
    public void start() throws Exception {
        System.out.println("Verticle " + this.getClass().getName() + " " + this);
        db.doLoginUser();
    }

}
package testInject;

import com.google.inject.Inject;

public class Test2 extends MyVerticle {
 
    // @Inject
    Database     db = new Database();

    @Override
    public void start() throws Exception {
        System.out.println("Verticle " + this.getClass().getName() + " " + this);
        db.doLoginUser();
    }

}
package testInject;

import io.vertx.core.Vertx;
import io.vertx.core.Context;
import io.vertx.core.AbstractVerticle;

abstract class MyVerticle extends AbstractVerticle {

    @Override
    public void init(Vertx vertx, Context context) {
        super.init(vertx,context);
        /* What to do to inject Database into the verticles ????*/
    }
}
package testInject;

import com.google.inject.Singleton;

@Singleton
public class Database {
    public void doLoginUser() {
        System.out.println("Done");
    }
}

为了让事情更简单一些,我不想每次都使用相同的模式来实现 数据库 db = Database.getInstance() 或在每个 Verticle 中创建此 Database-Class 的新实例(这是浪费内存)。只是一个 “@Inject Database db”会很棒。

由于 VertX 通过 Class-Name 初始化 verticle-Classes,我无法使用 Guice-injector.getInstance(Test1.class) 函数,它是做绑定。我没有弄清楚,如何在创建 Verticle-class 时在构造函数或初始化例程中自动绑定 Database-Class。 我的想法是否可行?如果可行,如何实现?

谢谢 尼克

我认为您不能像在 Spring 或 Guice 中那样注入 Verticle。

您应该将每个 Verticle 视为孤立的 java 进程,您只能从外部启动或终止它。

这意味着,您必须为每个 Verticle 创建一个 db 实例。当然,您可以在 super-class MyVerticle 中分解它的创建以节省一些代码,但 db-per-verticle 概念仍然存在。

处理此类问题的 vert.x-ish 方法是将 db 实例放在另一个 Verticle 中,并通过事件总线与其通信。