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