我有一个Module
提供了一个像这样的JDBI DBI
实例:
@Provides
@Singleton
DBI dbi(DataSource dataSource) { return new DBI(dataSource); }
在另一个模块中,我想在该DBI实例上调用一些初始化方法(配置对特定数据类型的支持)。放入JDBI模块本身并不合适,因为它的应用程序特定于使用JDBI的任何应用程序都不通用。是否有一个钩子让我做那种"额外"配置?
我尝试使用bindListener
方法,但似乎没有为以这种方式提供的对象调用。
答案 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旨在为不同目的提供许多不同的模块。这允许您交换设置和其他注入,同时保留其他注入。
所以你可以做以下的事情:
示例:
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 {}
示例:
@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(),
...);