Google Guice - Omówienie
Guice to oparty na Javie framework iniekcji zależności typu open source. Jest lekki i jest rozwijany i zarządzany przez Google. W tym rozdziale znajdziesz ogólny przegląd struktury Guice.
Dependency Injection
Każda aplikacja oparta na języku Java ma kilka obiektów, które współpracują ze sobą, prezentując to, co użytkownik końcowy widzi jako działającą aplikację. Pisząc złożoną aplikację Java, klasy aplikacji powinny być jak najbardziej niezależne od innych klas Java, aby zwiększyć możliwość ponownego użycia tych klas i testowania ich niezależnie od innych klas podczas testów jednostkowych. Dependency Injection (lub czasami nazywany okablowaniem) pomaga w sklejaniu tych klas ze sobą, a jednocześnie utrzymaniu ich niezależności.
Rozważ, że masz aplikację, która ma komponent edytora tekstu i chcesz zapewnić sprawdzanie pisowni. Twój standardowy kod wyglądałby mniej więcej tak -
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor() {
spellChecker = new SpellChecker();
}
}
Zauważ, że tutaj stworzyliśmy zależność między TextEditor a SpellChecker. W scenariuszu odwrócenia kontroli zamiast tego zrobilibyśmy coś takiego -
public class TextEditor {
private SpellChecker spellChecker;
@Inject
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
}
Tutaj TextEditor nie powinien przejmować się implementacją sprawdzania pisowni. SpellChecker zostanie zaimplementowany niezależnie i zostanie dostarczony do TextEditor w czasie tworzenia instancji TextEditor.
Dependency Injection using Guice (Binding)
Dependency Injection jest kontrolowany przez Guice Bindings. Guice używa powiązań do mapowania typów obiektów na ich rzeczywiste implementacje. Te powiązania są zdefiniowane jako moduł. Moduł to zbiór powiązań, jak pokazano poniżej -
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);
}
}
Iniektor to narzędzie do tworzenia grafów obiektów, a moduł to jego podstawowy element konstrukcyjny. Dlatego pierwszym krokiem jest utworzenie wtryskiwacza, a następnie użycie wtryskiwacza do pobrania obiektów.
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);
}
W powyższym przykładzie graf obiektu klasy TextEditor jest konstruowany przez Guice i ten wykres zawiera obiekt TextEditor i jego zależność jako obiekt WinWordSpellChecker.