配置Guice模块提供的对象

我有一个提供JDBI DBI实例的Module ,如下所示:

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

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

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

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

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

 class MyConfigurationModule extends AbstractModule { @Override protected void configure() { requestInjection(this); } @Inject void configureDbi(DBI dbi) { // Do whatever configuration. } } 

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

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

  • 为您的应用程序创建一个注释,以便与DBIdependency injection一起使用:

例:

 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(), ...);