3. diel - Java server - Google Guice
V minulej lekcii, Java server - Parametre servera , sme sa zaoberali parametre servera. Dnes si
naimplementujeme správu závislostí pomocou knižnice Google Guice. Výsledkom
nášho snaženia bude získanie inštancie s rozhraním
IParameterProvider
pomocou Google Guice. V budúcnosti budeme takto
získavať všetky inštancie.
Google Guice
Ak nemáte tušenie, čo to je dependency injection, odporúčam si pozorne prečítať miestnej DI kurz. Pre pochopenie samotného Google Guice, odporúčam nasledujúce sériu videí.
V skratke sa jedná o knižnicu, ktorá bude vytvárať inštancie tried a postará sa nám o ich prenose naprieč aplikácií tam, kde je práve potrebujeme.
Pridanie závislosti
Začneme tým, že si pridáme závislosť do nášho projektu, konkrétne do
modulu pre server
. Otvorte si súbor build.gradle
a
pridajte nasledujúci závislosť do bloku dependencies
:
implementation group: 'com.google.inject', name: 'guice', version: '4.2'
Továreň na parametre
Z predchádzajúcej lekcie máme vytvorenú triedu CmdParser
a
rozhrania IParameterProvider
. Teraz si ukážeme, ako pomocou
Google Guice vytvoriť inštanciu národné implementačné
IParameterProvider
. Pre vytvorenie inštancie musíme použiť továreň,
pretože trieda CmdParser
má vo svojom konstruktoru parameter,
ktorý musíme odovzdať "zvonku". V balíčku cmd
vytvoríme nové
rozhranie nazvané IParameterFactory
. Toto rozhranie bude mať
jednu metódu, ktorá bude vytvárať konkrétne inštanciu s rozhraním
IParameterProvider
:
package cz.stechy.chat.cmd; public interface IParameterFactory { IParameterProvider getParameters(String[] args); }
Ďalej vytvoríme implementáciu tejto továrne v podobe triedy
ParameterFactory
:
package cz.stechy.chat.cmd; import com.google.inject.Singleton; @Singleton public class ParameterFactory implements IParameterFactory { @Override public IParameterProvider getParameters(String[] args) { return new CmdParser(args); } }
Implementácia metódy getParameters()
je veľmi jednoduchá.
Iba sa vytvorí a vráti nová inštancie triedy CmdParser
.
Konfigurujeme Guice
Teraz nakonfigurujeme Google Guice, aby namapoval správne inštancie.
Vytvoríme novú triedu ServerModule
, ktorá bude dediť od triedy
com.google.inject.AbstractModule
a implementujeme jedinú metódu:
configure()
. Trieda sa nenachádza v balíčku cmd
,
ale o úroveň vyššie.
package cz.stechy.chat; import com.google.inject.AbstractModule; import cz.stechy.chat.cmd.IParameterFactory; import cz.stechy.chat.cmd.ParameterFactory; public class ServerModule extends AbstractModule { @Override public void configure() { bind(IParameterFactory.class).to(ParameterFactory.class); } }
V tejto triede sa deje všetka mágia ohľadom mapovanie implementácií na
jednotlivé rozhrania. V našom prípade tu máme iba jedno mapovanie a to
implementácia rozhrania IParameterFactory
pomocou triedy
ParameterFactory
.
Hlavná trieda
Konečne vytvoríme spúšťací triedu aplikácie. Vytvoríme teda novú
triedu Server
. Umiestnite ju do rovnakej zložky ako je
ServerModule
.
Ďalej v triede vytvoríme jednu inštančný konštantu typu
IParameterFactory
:
private final IParameterFactory parameterFactory;
Konštruktor triedy bude mať jeden parameter a to práve rozhranie
IParameterFactory
:
@Inject public Server(IParameterFactory parameterFactory) { this.parameterFactory = parameterFactory; }
Všimnite si anotácie @Inject
. Táto anotácia pochádza práve
z knižnice Google Guice a hovorí, že parametre konstruktoru sú závislosti,
ktoré Guice dodá.
Následne vytvoríme privátne inštančný metódu run()
,
ktorá bude vstupným bodom aplikácie:
private void run(String[] args) { final IParameterProvider parameters = parameterFactory.getParameters(args); System.out.println("Maximalni pocet klientu: " + parameters.getInteger(CmdParser.CLIENTS)); }
Pre túto chvíľu si len vypíšeme do konzoly informáciu o maximálnom počte klientov.
Nakoniec vytvoríme statickú metódu main()
, v ktorej
vytvoríme injektor, získame inštanciu triedy server a spustíme vyššie
vytvorenú metódu run()
:
public static void main(String[] args) throws Exception { final Injector injector = Guice.createInjector(new ServerModule()); Server server = injector.getInstance(Server.class); server.run(args); }
Spustení aplikácie
Aplikáciu spustíme pomocou grádl príkazom:
gradlew server:run -Parg=-port=6298,-clients=5,-max_waiting_queue=10
Výsledkom by malo byť číslo 5
, ktoré zodpovedá
maximálnemu počtu klientov.
Ak sa vám všetko podarilo, tak gratulujem, práve ste naimplementovali správu závislostí pomocou knižnice Google Guice. V prípade problémov sa môžete pozrieť do archívu, ktorý je k stiahnutiu pod článkom, a nájsť si chybu. Nabudúce, v lekcii Java server - Vlákno servera , vytvoríme kostru pre vlákno servera.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 25x (142.19 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java