Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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é 24x (142.19 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Java server - Parametre servera
Všetky články v sekcii
Server pre klientskej aplikácie v Jave
Preskočiť článok
(neodporúčame)
Java server - Vlákno servera
Článok pre vás napísal Petr Štechmüller
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje primárně programování v Javě, ale nebojí se ani webových technologií.
Aktivity