Таким образом согласно моему тестированию, Если у Вас есть что-то как:
Module modA = new AbstractModule() {
public void configure() {
bind(A.class).to(AImpl.class);
bind(C.class).to(ACImpl.class);
bind(E.class).to(EImpl.class);
}
}
Module modB = New AbstractModule() {
public void configure() {
bind(A.class).to(C.class);
bind(D.class).to(DImpl.class);
}
}
Guice.createInjector(Modules.overrides(modA, modB)); // gives me binding for A, C, E AND D with A overridden to A->C.
Но что, если Вы хотите удалить привязку для E в modB? Я, может казаться, не нахожу способ сделать это, не имея необходимость повреждать связывание для E в отдельный модуль. Существует ли путь?
SPI может это сделать. Используйте Elements.getElements (modA, modB)
, чтобы получить список объектов Element
, представляющих ваши привязки. Просмотрите этот список и удалите привязку, ключ которой вы хотите удалить. Затем создайте модуль из отфильтрованных элементов, используя Elements.getModule ()
. Собираем все вместе:
public Module subtractBinding(Module module, Key<?> toSubtract) {
List<Element> elements = Elements.getElements(module);
for (Iterator<Element> i = elements.iterator(); i.hasNext(); ) {
Element element = i.next();
boolean remove = element.acceptVisitor(new DefaultElementVisitor<Boolean>() {
@Override public <T> Boolean visit(Binding<T> binding) {
return binding.getKey().equals(toSubtract);
}
@Override public Boolean visitOther(Element other) {
return false;
}
});
if (remove) {
i.remove();
}
}
return Elements.getModule(elements);
}