2014-11-06 60 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

...