无法使用Guice和Vertx将相同的实例注入多个Verticle

时间:2015-09-15 13:46:04

标签: java dependency-injection guice vert.x

我有3个vertx verticle。

我创建了类AImpl,它实现了类A,如下所示

 @Singleton
public class AImpl implements A {


    public LocationServiceImpl() {
        System.out.println("initiated once");

    }

 public void doSomething(){..}

Verticle 1看起来像这样:

public class MyVerticle1 extends AbstractVerticle {
...
 @Inject
    private A a;


 @Override
    public void start(Future<Void> fut) {
 Guice.createInjector(new AppInjector()).injectMembers(this);
  a.doSomething(..);

..}

MyVerticle2和MyVerticle3看起来一样。

Guice代码:

public class AppInjector extends AbstractModule {


    public AppInjector() {
    }


    @Override
    protected void configure() {   
 bind(A.class).to(AImpl.class).in(Singleton.class);

    }

现在当我运行vertx时,我可以看到我得到3个不同的AImpl实例:

 public static void main(String[] args) throws InterruptedException {
        final Logger logger = Logger.getLogger(StarterVerticle.class);
        ClusterManager mgr = new HazelcastClusterManager();
        VertxOptions options = new VertxOptions().setClusterManager(mgr);
        Vertx.clusteredVertx(options, res -> {
            if (res.succeeded()) {
                Vertx vertx = res.result();
                vertx.deployVerticle(new MyVerticle1());
                vertx.deployVerticle(new MyVerticle2());
                vertx.deployVerticle(new MyVerticle3());
                logger.info("Vertx cluster started!");
            } else {
                logger.error("Error initiating Vertx cluster");
            }
        });

控制台:

2015-09-15 16:36:15,611 [vert.x-eventloop-thread-0] INFO   - Vertx cluster started!
initiated once
initiated once
initiated once

我用guice辱骂什么?为什么我没有得到相同的AImpl实例?

谢谢, 射线。

1 个答案:

答案 0 :(得分:2)

你正在以错误的方式使用guice。您正在通过new创建MyVerticle实例,并在其开始消息中创建注入器。因此,你最终会得到3个注射器,每个注射器都有一个单独的注射器。

你必须在main()方法中创建一次注入器,然后让guice处理MyVerticles的创建:

Injector injector = Guice.createInjector(....);
...
vertx.deployVerticle(injector.getInstance(MyVerticle1.class);

现在,注入器只为AImpl创建一个实例,并将其重用于所有@Inject AImpl个位置。完全从启动方法中移除喷射器。

使用guice时的2条经验法则:

  1. 避免使用new
  2. 尝试仅使用位于main()方法中的一个注入器