Guice — это среда внедрения зависимостей на основе Java с открытым исходным кодом. Это тихий легкий и активно разрабатывается / управляется Google.
Внедрение зависимости
Каждое 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 (Binding)
Инъекция зависимостей контролируется привязками 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); } }
Модуль является основным строительным блоком для Инжектора, который является создателем графов объектов Guice. Первый шаг — создать инжектор, а затем мы можем использовать инжектор, чтобы получить объекты.
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.