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 中,并通过事件总线与其通信。
我在具有多个访问数据库的 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 中,并通过事件总线与其通信。