假设我有这样一个接口:
public interface DbMapper{
}
然后是这个实现:
public interface NameDbMapper extends DbMapper {
@SqlUpdate("insert into names (name) values (:name)")
void insert(@Bind("name") String name);
}
这个实现方法存在于一个模块中,因此我在编译时并不知道所有的DbMappers。我通过反射来发现DbMappers:
public class GuiceModule extends AbstractModule{
@Override
protected void configure() {
Reflections reflections = new Reflections("com.company");
Set<Class<? extends DbMapper>> dbMappers = reflections.getSubTypesOf(DbMapper.class);
for (Class<? extends DbMapper> dbMapper : dbMappers) {
Class<DbMapper> db = (Class<DbMapper>) dbMapper;
binder().bind(db).toProvider(DbMapperProvider.class);
}
}
然后我在提供程序中实例化映射器:
public class DbMapperProvider implements Provider<DbMapper> {
private final User user;
@Inject
public DbMapperProvider(User user) {
this.user = user;
}
@Override
public DbMapper get() {
String jdbc = user.getJdbc();
DBI userSpecificDatabase = new DBI(jdbc, "user", "password");
//How to replace NameDbMapper.class here with the db variable in GuiceModule?
DbMapper dbMapper = userSpecificDatabase.onDemand(NameDbMapper.class);
return dbMapper;
}
}
用户是一个@RequestScoped实例,因此我无法在GuiceModule中正常创建提供程序。注入用户可以工作,但是我如何传递哪个类DBI应该使用而不是硬编码NameDbMapper在DbMapperProvider中?
我尝试了http://google-guice.googlecode.com/git/javadoc/com/google/inject/assistedinject/FactoryModuleBuilder.html中建议的方法,但无法使其正常工作。
这里的目标是模块不应编写自己的提供程序,这可行吗?
new Object
,还能注入它的字段/方法) - durron597requestInjection()
和toInstance()
是另外两个例子。请参考这里获取更多信息。 - Tavian Barnes