基本上这两种方法合而为一:
Can Guice automatically create instances of different classes based on a parameter?
Guice injecting only some of the constructor
例如: 用映射和辅助注入创建用户操作处理程序,即每个都需要一些静态绑定以及从请求动态创建的操作上下文。
class OpHandler { void handle()... }
class SendHandler extends OpHandler {
public SendHandler(DAL dal, SendContext context) { ... }
}
class ReceiveHandler extends OpHandler {
public ReceiveHandler(DAL dal, ReceiveContext context) { ... }
}
servlet:
onGet() {
op = resolveOp();
switch (op) {
SEND: create SendContext and pass it somehow to ioc.getInstance(SendHandler.class)
RECEIVE: create ReceiveContext and pass it somehow to ioc.getInstance(ReceiveHandler.class)
}
}
答案 0 :(得分:0)
您想使用AssistedInject。
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.FactoryProvider;
import com.google.inject.name.Named;
import com.google.inject.name.Names;
import junit.framework.Assert;
import org.junit.Test;
import java.io.IOException;
public class StackOverflowTest {
public static class Dal {
}
public static interface OpHandler {
}
public static class SendOpHandler implements OpHandler {
@Inject
public SendOpHandler(Dal dal, @Assisted String rest) {
}
}
public static class RecOpHandler implements OpHandler {
@Inject
public RecOpHandler (Dal dal, @Assisted String rest) {
}
}
public static interface OpHandlerProvider {
public OpHandler get(String rest);
}
public static class SUT {
OpHandlerProvider send;
OpHandlerProvider rec;
@Inject
public SUT(@Named("send") OpHandlerProvider send, @Named("rec") OpHandlerProvider rec ) {
this.send = send;
this.rec = rec;
}
}
@Test
public void test() throws IOException {
Injector i = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(OpHandlerProvider.class).annotatedWith(Names.named("send")).toProvider(FactoryProvider.newFactory(OpHandlerProvider.class, SendOpHandler.class));
bind(OpHandlerProvider.class).annotatedWith(Names.named("rec")).toProvider(FactoryProvider.newFactory(OpHandlerProvider.class, RecOpHandler.class));
}
});
SUT sut = i.getInstance(SUT.class);
Assert.assertTrue(sut.send.get("") instanceof SendOpHandler);
Assert.assertTrue(sut.rec.get("") instanceof RecOpHandler);
}
}