2015-09-15 16 views
3

我有3個vertex verticle。無法使用Guice和Vertx將同一實例注入到多個Verticles

我創建的類的AIMP1它實現類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看起來相同。

吉斯代碼:

public class AppInjector extends AbstractModule { 


    public AppInjector() { 
    } 


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

    } 

現在,當我運行vertx我可以看到,我得到的AIMP1的3種不同的情況:

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

您正在使用guice錯誤的方式。您正在通過new創建MyVerticle實例,並在其開始消息內創建注入器。因此,你最終得到3個注射器,每個注射器都持有一個單體。

你必須在你的main()方法創建一次進樣器,然後讓吉斯處理MyVerticles的創建:

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

現在的噴射器的AIMP1只創建一個實例,並再次用於所有@Inject AImpl位置。完全從開始方法中移除注射器。與吉斯工作時拇指

2個規則:

  1. 忌用new
  2. 儘量只使用一個單一的噴油器位於您的main()方法
+0

感謝您的答覆。你能展示一個具體的例子嗎?我不知道我應該如何創建我的Verticle沒有新的,我應該如何定義在Guice上的tham – rayman

+0

你能解釋一下如何解決這個問題嗎? – rayman

+0

接受是否意味着你明白了,還是應該提供一個例子? –

相關問題