Предположим, что у нас есть следующие компоненты:
public interface Type {}
public class TypeImpl implements Type {
private String name;
public TypeImpl(String name) {this.name = name;}
public String getName() {return name;}
@Override
public String toString() {return name.toString();}
}
public class InstallConfigurationModule extends AbstractModule {
@Override
protected void configure() {
super.configure();
// new ModuleA()
bind(Type.class).annotatedWith(Names.named("a")).toInstance((Type) new TypeImpl("a"));
// new ModuleB()
bind(Type.class).annotatedWith(Names.named("b")).toInstance((Type) new TypeImpl("b"));
}
}
что он не использует метод установки, но вы можете использовать его; метод configure использует API Names.name, чтобы пометить TypeImpl как «a», а другой как «b».
Мы должны поместить аннотации @Named и @Inject в класс Car
import com.google.inject.name.Named;
import javax.inject.Inject;
public class Car {
private Type a;
private Type b;
@Inject
public void setA(@Named("a") Type a) {
this.a = a;
}
@Inject
public void setB(@Named("b") Type b) {
this.b = b;
}
public void methodIsCalled(){
run();
}
private void run() {
System.out.println(a.toString());
System.out.println(b.toString());
}
}
Таким образом, инжектор будет знать, как настроить экземпляры типа.
Наконец, в основном классе или классе конфигурации у нас есть следующие операторы
public class MainClass {
public static void main(String[] args){
Injector injector = Guice.createInjector(new InstallConfigurationModule());
Car car = injector.getInstance(Car.class);
// method that it calss the run method
car.methodIsCalled();
}
}
Это вывод
a
b