Guice Beginner - Как связать конкретные классы?
У меня есть этот класс:
public class House {
private final Door door;
private final Window window;
private final Roof roof;
@Inject
public House(Door door, Window window, Roof roof) {
this.door = door;
this.window = window;
this.roof = roof;
}
}
Где Door
, Window
и Roof
- это конкретные классы. Теперь, если я хочу реализовать модуль для этого сценария, я бы сделал это следующим образом:
public class HouseModule extends AbstractModule {
@Override
protected void configure() {
bind(Door.class).to(Door.class);
bind(Window.class).to(Window.class);
bind(Roof.class).to(Roof.class);
}
}
Но мне интересно, правильно ли это связать конкретные классы или есть более простые способы. Я чувствую, что есть более простой способ этого.
ИЗМЕНИТЬ
Просто попробовал это, и он не работает:
1) Binding points to itself.
at de.tarent.guice.ex._1.HouseModule.configure(HouseModule.java:10)
РЕДАКТИРОВАТЬ 2
Кажется, что никакой привязки не требуется вообще:
Injector injector = Guice.createInjector();
House house = injector.getInstance(House.class);
Также, похоже, работает.
Ответы
Ответ 1
Guice Взаимодействие Just-In-Time делает именно то, что вы хотите. Учитывая ваши Door
, Window
и Roof
отвечают следующим требованиям (цитируется в документации Guice ):
либо публичный конструктор без аргументов, либо конструктор с аннотацией @Inject
будет достаточной пустая реализация модуля:
public class HouseModule extends AbstractModule {
@Override
protected void configure() {
}
}
Ответ 2
Это путь:
protected void configure() {
bind(Door.class);
bind(Window.class);
bind(Roof.class);
}
Поскольку они являются конкретными классами, как говорит Гиис, вы не можете привязывать их к себе: -)
Просмотрите Binder
docs, он отмечает:
bind(ServiceImpl.class);
Этот оператор практически ничего не делает; он "привязывает класс ServiceImpl
к себе" и не изменяет поведение по умолчанию Guice. Вы все равно можете использовать это, если предпочитаете, чтобы ваш класс Module
служил явным манифестом для предоставляемых услуг. Кроме того, в редких случаях Guice может оказаться неспособным проверить привязку во время создания инжектора, если это не указано явно.
Конкретные классы с конструктором, помеченные как @Inject
, автоматически доступны для инъекций. Но это помогает разработчику (вам) знать, что настроено в модуле.
Ответ 3
Связывание необходимо для связывания интерфейса и класса реализации (для перехода к другой реализации в тестовой среде, например). Но поскольку у вас есть конкретные классы, нет необходимости связывать с, просто привяжите классы