Google Guice - Обзор
Guice - это среда внедрения зависимостей на основе Java с открытым исходным кодом. Он легкий, разработан и управляется Google. Эта глава даст вам обзор фреймворка Guice.
Внедрение зависимости
Каждое приложение на основе Java имеет несколько объектов, которые работают вместе, чтобы представить то, что конечный пользователь видит как работающее приложение. При написании сложного приложения Java классы приложения должны быть как можно более независимыми от других классов Java, чтобы увеличить возможность повторного использования этих классов и их тестирования независимо от других классов во время модульного тестирования. Инъекция зависимостей (или иногда называемая проводкой) помогает склеивать эти классы вместе и в то же время сохранять их независимость.
Предположим, у вас есть приложение, в котором есть компонент текстового редактора, и вы хотите обеспечить проверку орфографии. Ваш стандартный код будет выглядеть примерно так -
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor() {
spellChecker = new SpellChecker();
}
}
Обратите внимание, что здесь мы создали зависимость между TextEditor и SpellChecker. В сценарии инверсии управления мы бы вместо этого сделали что-то вроде этого:
public class TextEditor {
private SpellChecker spellChecker;
@Inject
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
}
Здесь TextEditor не должен беспокоиться о реализации SpellChecker. SpellChecker будет реализован независимо и будет предоставлен TextEditor во время создания экземпляра TextEditor.
Внедрение зависимостей с использованием Guice (привязка)
Внедрение зависимостей контролируется привязками Guice. Guice использует привязки для сопоставления типов объектов с их фактическими реализациями. Эти привязки определяются как модуль. Модуль - это набор привязок, как показано ниже -
public class TextEditorModule extends AbstractModule {
@Override
protected void configure() {
/*
* Bind SpellChecker binding to WinWordSpellChecker implementation
* whenever spellChecker dependency is used.
*/
bind(SpellChecker.class).to(WinWordSpellChecker.class);
}
}
Инжектор - это построитель объектного графа, а модуль - его основной строительный блок. Таким образом, первый шаг - создать инжектор, а затем использовать инжектор для получения объектов.
public static void main(String[] args) {
/*
* Guice.createInjector() takes Modules, and returns a new Injector
* instance. This method is to be called once during application startup.
*/
Injector injector = Guice.createInjector(new TextEditorModule());
/*
* Build object using injector
*/
TextEditor textEditor = injector.getInstance(TextEditor.class);
}
В приведенном выше примере граф объекта класса TextEditor создается Guice, и этот граф содержит объект TextEditor и его зависимость как объект WinWordSpellChecker.