2014-11-06 76 views
1

我有一個Maven模塊,我定義了其他幾個Maven模塊共享的一些utils。 在這個模塊中我想創造一些單:Guice:使用注射器?

package org.me.util; 

public interface Baz { 
    String myMethod(String s); 
} 

@Singleton 
public class Foo implements Baz { 
private Bar bar; 

    @Inject 
    Foo(Bar bar) { 
     this.bar = bar; 
    } 

    @Override 
    public String myMethod(String s) { 
     return s; 
    } 

} 

然後,我結合我的接口:

public class MyModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     bind(Baz.class).to(Foo.class); 
    } 

} 

假設我想利用這個獨生子從另一個Maven的模塊(比如Web服務) ,我該如何做到這一點? 我發現的唯一辦法是在我UTIL Maven的模塊創建一個類,如:

package org.me.util; 
public class Main { 

    private static Injector injector = Guice.createInjector(new MyModule());; 

    public static Injector getInjector() { 
     return injector; 
    } 

我也可以在靜態main方法創建噴油器所看到的吉斯教程,並保存在某個地方實例。

從我的web服務

然後做這樣的事情:

Baz baz = Main.getInjector().getInstance(Baz.class);  

但這似乎不是很優雅,因爲我必須(向它提供一個靜態的吸氣劑在這種情況下)周圍通過我的注射器。

有沒有其他辦法?謝謝。

+0

理想情況下,你也想注入什麼是其他模塊中。你可以@Inject Baz baz'然後從注射器得到需要的'Baz'的實例嗎? – condit 2014-11-06 13:28:22

+0

我不知道我跟着你。我正在爲Guice和DI做第一步。但注入@Inject Baz baz這樣的字段不是不好的做法嗎?無論如何,我不明白如何在不使用噴油器的情況下獲得我的單例實例。 – dmz73 2014-11-06 14:39:47

+0

對 - 你也可以注入到其他類的構造函數中。我要說的是,如果可能的話,你應該'@Inject'你的單身人士在你需要它的地方。如果Guice創建對象,它只能幫助你。 – condit 2014-11-06 15:14:33

回答

1

更優雅的方式來通過Baz對象注入它。

例如,

public class BusinessService { 
    private final Baz baz; 
    @Inject 
    public BusinessService(Baz baz) { this.baz = baz; } 
} 

並再次,如果你想使用的BusinessService的WS。

public class WebService { 
    private final BusinessService businessService; 
    @Inject 
    public WebService(BusinessService businessService) { this.businessService = businessService; } 
} 

通過這樣做,所有依賴項都清楚地暴露在API簽名中。


剩下的問題是,您必須在應用程序的入口點創建注入器。

在獨立應用程序中,通常在主方法中創建注入器。

public static void main(String[] args) { 
    Injector injector = Guice.createInjector(new UtilModule(), new BusinessModule()); 
    BusinessService businessService = injector.getInstance(BusinessService.class); 
    ... 

} 

在Web應用程序中,可能以不同的方式創建注入器。這取決於框架。

的Servlet:

Dropwizard

playframework

...