配置Guice模块提供的对象

时间:2014-06-19 15:10:59

标签: java dependency-injection guice

我有一个Module提供了一个像这样的JDBI DBI实例:

@Provides
@Singleton
DBI dbi(DataSource dataSource) { return new DBI(dataSource); }

在另一个模块中,我想在该DBI实例上调用一些初始化方法(配置对特定数据类型的支持)。放入JDBI模块本身并不合适,因为它的应用程序特定于使用JDBI的任何应用程序都不通用。是否有一个钩子让我做那种"额外"配置?

我尝试使用bindListener方法,但似乎没有为以这种方式提供的对象调用。

2 个答案:

答案 0 :(得分:8)

Guice Injections documentation描述了如何通过使用@Inject注释方法来调用实例方法。

它没有提到实例可以是Guice模块。因此,您可以这样做:

class MyConfigurationModule extends AbstractModule {
  @Override
  protected void configure() {
    requestInjection(this);
  }

  @Inject
  void configureDbi(DBI dbi) {
    // Do whatever configuration.
  }  
}

答案 1 :(得分:0)

Guice旨在为不同目的提供许多不同的模块。这允许您交换设置和其他注入,同时保留其他注入。

所以你可以做以下的事情:

  • 为您的应用程序创建一个注释,以便与DBI依赖注入一起使用:

示例:

import com.google.inject.BindingAnnotation;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;

@BindingAnnotation @Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
public @interface ApplicationDBI {}
  • 为特定于您的应用程序的DBI创建第二个模块。

示例:

@Provides @ApplicationDBI
// Choose the appropriate scope here
protected DBI provideConfiguredDBI(DBI baseDBI) {
    // configure the baseDBI here
    return baseDBI;
}
  • 使用新注释注释应用程序注入

示例:

public class DatabaseWrapper {
    private final DBI dbi;
    @Inject
    DatabaseWrapper(@ApplicationDBI DBI dbi) {
        this.dbi = dbi;
    }
}

然后在你的主要方法中:

Injector inj = Guice.createInjector(new DatabaseModule(),
                 new ApplicationDBIModule(),
                 ...);