guice注入

bpzcxfmw  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(370)

我在一个带有多个verticle的vertx应用程序上编写,这些verticle访问一个数据库。每个数据库包代表一个java类。这些类中的每一个都可以实现为一个单例类。
我做了一个小例子:2个verticles,它们正在使用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");
    }
}

为了让事情变得简单一点,我不想每次都用database db=database.getinstance()实现相同的模式,也不想在每个垂直方向上创建这个数据库类的新示例(这是浪费内存)。只要一个“@inject database db”就好了。
因为vertx通过类名初始化verticle类,所以我不能使用guice injector.getinstance(test1.class)函数来进行绑定。我不知道如何在创建verticle类时在构造函数或初始化例程中自动绑定数据库类。我的想法可行吗?如果可行怎么办?
泰铢nik

jei2mxaa

jei2mxaa1#

我不认为你可以像在spring或guice中那样注入到verticles中。
您应该将每个垂直视为独立的java进程,您只能从外部启动或终止它。
也就是说,你必须创造一个 db 每个垂直的示例。当然你可以在你的超类中计算出它的创建 MyVerticle 以节省一些代码,但db per verticle概念仍然存在。
处理这类问题的极端方法是 db 示例,并通过事件总线与之通信。

相关问题