Sprievodca Google Guice

1. Úvod

Tento článok preskúma základy Google Guice. Pozrime sa na prístupy k dokončeniu základných úloh Dependency Injection (DI) v Guice.

Budeme tiež porovnávať a porovnávať prístup Guice s prístupmi zavedenejších rámcov DI, ako sú Spring and Contexts and Dependency Injection (CDI).

Tento článok predpokladá, že čitateľ porozumel základom vzoru Injekcia závislostí.

2. Inštalácia

Ak chcete vo svojom projekte Maven používať program Google Guice, budete musieť do svojho programu pridať nasledujúcu závislosť pom.xml:

 com.google.inject guice 4.1.0 

K dispozícii je tu tiež zbierka rozšírení Guice (o tých sa budeme baviť neskôr), ako aj moduly tretích strán na rozšírenie schopností Guice (hlavne poskytnutím integrácie do zavedenejších rámcov Java).

3. Základné vstrekovanie závislostí pomocou Guice

3.1. Naša vzorová žiadosť

Budeme pracovať so scenárom, v ktorom navrhujeme triedy, ktoré podporujú tri komunikačné prostriedky v obchode helpdesku: e-mail, SMS a okamžité správy.

Zvážte triedu:

komunikácia na verejnej komunikácii {@Inject private Logger logger; @Inject súkromný komunikátor komunikátor; verejná komunikácia (Boolean keepRecords) {if (keepRecords) {System.out.println ("protokolovanie správ povolené"); }} public boolean sendMessage (strunova sprava) {vratit komunikator.sendMessage (sprava); }}

Toto Komunikácia trieda je základnou komunikačnou jednotkou. Inštancia tejto triedy sa používa na odosielanie správ cez dostupné komunikačné kanály. Ako je uvedené vyššie, KomunikáciaKomunikátor ktoré používame na samotný prenos správ.

Základným vstupným bodom do Guice je Injektor:

public static void main (String [] args) {Injector injector = Guice.createInjector (new BasicModule ()); Komunikácia comms = injector.getInstance (Communication.class); } 

Táto hlavná metóda získava inštanciu našej Komunikácia trieda. Zavádza tiež základný koncept Guice: Modul (použitím Základný modul v tomto príklade). The Modul je základná jednotka definície väzieb (alebo rozvody, ako je známe na jar).

Spoločnosť Guice prijala prístup založený na kódexe pre vkladanie a správu závislostí takže nebudete mať do činenia s množstvom XML out-of-the-box.

V príklade vyššie je strom závislostí Komunikácia budú implicitne vložené pomocou funkcie s názvom just-in-time väzba, za predpokladu, že triedy majú predvolený konštruktor no-arg. Toto je funkcia v Guice od začiatku a dostupná iba na jar od verzie 4.3.

3.2. Viazanie Guice

Väzba je pre Guice, pretože elektroinštalácia je pre Spring. S viazaním ty definovať, ako bude Guice pridávať závislosti do triedy.

Väzba je definovaná v implementácii com.google.inject.AbstractModule:

verejná trieda BasicModule rozširuje AbstractModule {@Override protected void configure () {bind (Communicator.class) .to (DefaultCommunicatorImpl.class); }}

Táto implementácia modulu špecifikuje, že inštancia PredvolenéCommunicatorImpl sa má vpichovať kdekoľvek a Komunikátor premenná sa nachádza.

Ďalšou stelesnením tohto mechanizmu je pomenovaná väzba. Zvážte nasledujúcu deklaráciu premennej:

@Inject @Named ("DefaultCommunicator") Komunikátor komunikátor; 

K tomu budeme mať nasledujúcu záväznú definíciu:

@Override protected void configure () {bind (Communicator.class) .annotatedWith (Names.named ("DefaultCommunicator")) .to (Communicator.class); } 

Táto väzba poskytne príklad Komunikátor na premennú s poznámkou @Named („DefaultCommunicator“) anotácia.

Všimnete si @Inject a @ Menovaný anotácie sa javia ako anotácie výpožičky z CDI spoločnosti Jakarta EE a sú nimi. Sú v com.google.inject. * balík - pri použití IDE by ste mali byť opatrní pri dovoze zo správneho balíka.

Tip: Aj keď sme práve povedali, že použijeme Guice @Inject a @ Menovaný, stojí za zmienku, že spoločnosť Guice poskytuje podporu pre javax.inject.Inject a javax.inject. Názov, okrem iných anotácií Jakarta EE.

Môžete tiež vložiť závislosť, ktorá nemá predvolený konštruktor no-arg pomocou väzba konštruktora:

verejná trieda BasicModule rozširuje AbstractModule {@Override protected void configure () {bind (Boolean.class) .toInstance (true); bind (Communication.class) .toConstructor (Communication.class.getConstructor (Boolean.TYPE)); } 

Fragment vyššie vloží inštanciu Komunikácia pomocou konštruktora, ktorý zaberá a boolovský argument. Dodávame pravda argument pre konštruktéra definovanie an necielená väzba z Boolovský trieda.

Toto necielená väzba budú dychtivo dodávané každému konštruktorovi vo väzbe, ktorý akceptuje a boolovský parameter. S týmto prístupom všetky závislosti z Komunikácia sa vstrekujú.

Ďalším prístupom k väzbe špecifickej pre konštruktéra je inštančná väzba, kde uvádzame inštanciu priamo vo väzbe:

verejná trieda BasicModule rozširuje AbstractModule {@Override protected void configure () {bind (Communication.class) .toInstance (new Communication (true)); }}

Táto väzba poskytne príklad Komunikácia triedy kdekoľvek a Komunikácia je deklarovaná premenná.

V takom prípade však strom závislostí triedy nebude automaticky prepojený. Mali by ste obmedziť použitie tohto režimu, keď nie je potrebná nijaká náročná inicializácia alebo vkladanie závislostí.

4. Typy injekcií závislostí

Guice podporuje štandardné typy injekcií, ktoré by ste u modelu DI očakávali. V Komunikátor triedy, musíme vpichnúť rôzne druhy Režim komunikácie.

4.1. Vstrekovanie do terénu

@Inject @Named ("SMSComms") CommunicationMode smsComms;

Použite voliteľné @ Menovaný anotácia ako kvalifikátor na implementáciu cieleného vkladania na základe názvu

4.2. Metóda vstrekovania

Tu používame nastavovaciu metódu na dosiahnutie vstrekovania:

@Inject public void setEmailCommunicator (@Named ("EmailComms") CommunicationMode emailComms) {this.emailComms = emailComms; } 

4.3. Constructor Injection

Závislosti môžete vložiť aj pomocou konštruktora:

@Inject public Communication (@Named ("IMComms") CommunicationMode imComms) {this.imComms = imComms; } 

4.4. Implicitné injekcie

Guice implicitne vloží niektoré komponenty na všeobecné použitie, ako napríklad Injektor a inštancia java.util.Logger, medzi inými. Všimnete si, že vo všetkých vzorkách používame protokolovacie nástroje, ale nenájdete pre nich skutočnú väzbu.

5. Rozsah v Guice

Guice podporuje rozsahy a mechanizmy rozsahu, na ktoré sme si zvykli v iných rámcoch DI. Guice predvolene poskytuje novú inštanciu definovanej závislosti.

5.1. Singleton

Vložme do našej aplikácie singleton:

viazať (Communicator.class) .annotatedWith (Names.named ("AnotherCommunicator")) .to (Communicator.class) .in (Scopes.SINGLETON); 

The in (Scopes.SINGLETON) špecifikuje, že akékoľvek Komunikátor pole s @Named („AnotherCommunicator“) dostane injekciu singleton. Tento singlet je predvolene lenivo iniciovaný.

5.2. Dychtivý Singleton

Poďme teraz vstreknúť nedočkavý singleton:

viazať (Communicator.class) .annotatedWith (Names.named ("AnotherCommunicator")) .to (Communicator.class) .asEagerSingleton (); 

The asEagerSingleton () hovor definuje singleton ako dychtivo konkretizovaný.

Okrem týchto dvoch rozsahov podporuje Guice okrem vlastných rozsahov aj iba web @RequestScoped a @SessionScoped anotácie, dodávané spoločnosťou Jakarta EE (neexistujú verzie týchto anotácií dodané spoločnosťou Guice).

6. Aspektovo orientované programovanie v Guice

Guice je v súlade so špecifikáciami AOPAlliance pre aspektovo orientované programovanie. Kvintesenciálny zachytávač protokolovania, ktorý použijeme na sledovanie odosielania správ v našom príklade, môžeme implementovať iba v štyroch krokoch.

Krok 1 - Implementácia AOPAlliance MethodInterceptor:

verejná trieda MessageLogger implementuje MethodInterceptor {@Inject Logger logger; @ Verzia Verejné vyvolanie objektu (vyvolanie MethodInvocation) hodí Throwable {Object [] objectArray = invocation.getArguments (); pre (Object object: objectArray) {logger.info ("Odosielanie správy:" + object.toString ()); } spätne vyvolanie.proceed (); }} 

Krok 2 - Definujte obyčajnú anotáciu Java:

@Retention (RetentionPolicy.RUNTIME) @Target (ElementType.METHOD) public @interface MessageSentLoggable {} 

Krok 3 - Definujte väzbu pre porovnávač:

Matcher je trieda Guice, ktorú používame, špecifikujeme komponenty, na ktoré sa bude vzťahovať naša anotácia AOP. V tomto prípade chceme, aby sa anotácia vzťahovala na implementácie Režim komunikácie:

verejná trieda AOPModule rozširuje AbstractModule {@Override protected void configure () {bindInterceptor (Matchers.any (), Matchers.annotatedWith (MessageSentLoggable.class), nový MessageLogger ()); }} 

Zadali sme a Matcher tu bude platiť náš MessageLogger interceptor do akýkoľvek triedy, ktorá má MessageSentLoggable anotácia použitá k jeho metódam.

Krok 4 - Použite našu anotáciu na náš komunikačný režim a načítajte náš modul

@Override @MessageSentLoggable public boolean sendMessage (reťazcová správa) {logger.info ("SMS správa odoslaná"); návrat pravdivý; } public static void main (String [] args) {Injector injector = Guice.createInjector (new BasicModule (), new AOPModule ()); Komunikácia comms = injector.getInstance (Communication.class); }

7. Záver

Po preskúmaní základných funkcií Guice môžeme vidieť, odkiaľ sa inšpirácia pre Guice vzala z jari.

Spolu s podporou JSR-330 si Guice kladie za cieľ vytvoriť injekčný DI rámec (zatiaľ čo Spring poskytuje celý ekosystém pre pohodlie programovania, nielen DI), zameraný na vývojárov, ktorí chcú flexibilitu DI.

Guice je tiež veľmi rozšíriteľný, čo umožňuje programátorom písať prenosné doplnky, ktoré vedú k flexibilnému a kreatívnemu použitiu rámca. Toto je dodatok k rozsiahlej integrácii, ktorú Guice už poskytuje pre najpopulárnejšie rámce a platformy ako Servlets, JSF, JPA a OSGi.

Všetky zdrojové kódy použité v tomto tutoriále nájdete v našom projekte GitHub.


$config[zx-auto] not found$config[zx-overlay] not found