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í.

Lekce 3 - Java server - Google Guice

V minulé lekci, Java server - Parametry serveru, jsme se zabývali parametry serveru.

Dnes si naimplementujeme správu závislostí pomocí knihovny Google guice. Výsledkem našeho snažení bude získání instance s rozhraním IParameterProvider pomocí Google guice. V budoucnu budeme takto získávat všechny instance.

Google guice

Pokud nemáte tušení, co to je dependency injection, doporučuji si pečlivě přečíst místní DI kurz. Pro pochopení samotného Google guice, doporučuji následující sérii videí.

Ve zkratce se jedná o knihovnu, která bude vytvářet instance tříd a postará se nám o jejich předávání napříč aplikací tam, kde je zrovna potřebujeme.

Přidání závislosti

Začneme tím, že si přidáme závislost do našeho projektu, konkrétně do modulu pro server. Otevřete si soubor build.gradle a přidejte následující závislost do bloku dependencies:

implementation group: 'com.google.inject', name: 'guice', version: '4.2'

Továrna na parametry

Z předchozí lekce máme vytvořenou třídu CmdParser a rozhraní IParameterProvider. Nyní si ukážeme, jak pomocí Google guice vytvořit instanci implementující IParameterProvider. Pro vytvoření instance musíme použít továrnu, protože třída CmdParser má ve svém konstruktoru parametr, který musíme předat "zvenčí". V balíčku cmd vytvoříme nové rozhraní nazvané IParameterFactory. Toto rozhraní bude mít jednu metodu, která bude vytvářet konkrétní instanci s rozhraním IParameterProvider:

package cz.stechy.chat.cmd;

public interface IParameterFactory {

    IParameterProvider getParameters(String[] args);
}

Dále vytvoříme implementaci této továrny v podobě třídy 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);
    }
}

Implementace metody getParameters() je velmi jednoduchá. Pouze se vytvoří a vrátí nová instance třídy CmdParser.

Konfigurujeme guice

Nyní nakonfigurujeme Google guice, aby namapoval správně instance. Vytvoříme novou třídu ServerModule, která bude dědit od třídy com.google.inject.AbstractModule a implementujeme jedinou metodu: configure(). Třída se nenachází v balíčku cmd, ale o úroveň výše.

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 této třídě se děje veškerá magie ohledně mapování implementací na jednotlivá rozhraní. V našem případě zde máme pouze jedno mapování a to implementace rozhraní IParameterFactory pomocí třídy ParameterFactory.

Hlavní třída

Konečně vytvoříme spouštěcí třídu aplikace. Vytvoříme tedy novou třídu Server. Umístěte ji do stejné složky jako je ServerModule.

Dále ve třídě vytvoříme jednu instanční konstantu typu IParameterFactory:

private final IParameterFactory parameterFactory;

Konstruktor třídy bude mít jeden parametr a to právě rozhraní IParameterFactory:

@Inject
public Server(IParameterFactory parameterFactory) {
    this.parameterFactory = parameterFactory;
}

Všimněte si anotace @Inject. Tato anotace pochází právě z knihovny Google guice a říká, že parametry konstruktoru jsou závislosti, které guice dodá.

Následně vytvoříme privátní instanční metodu run(), která bude vstupním bodem aplikace:

private void run(String[] args) {
    final IParameterProvider parameters = parameterFactory.getParameters(args);
    System.out.println("Maximalni pocet klientu: " + parameters.getInteger(CmdParser.CLIENTS));
}

Pro tuto chvíli si pouze vypíšeme do konzole informaci o maximálním počtu klientů.

Nakonec vytvoříme statickou metodu main(), ve které vytvoříme injektor, získáme instanci třídy server a spustíme výše vytvořenou metodu 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);
}

Spuštění aplikace

Aplikaci spustíme pomocí gradlu příkazem:

gradlew server:run -Parg=-port=6298,-clients=5,-max_waiting_queue=10

Výsledkem by mělo být číslo 5, které odpovídá maximálnímu počtu klientů.

Pokud se vám vše povedlo, tak gratuluji, právě jste naimplementovali správu závislostí pomocí knihovny Google guice. V případě problémů se můžete podívat do archivu, který je ke stažení pod článkem, a najít si chybu.

Příště, v lekci Java server - Vlákno serveru, vytvoříme kostru pro vlákno serveru.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 24x (142.19 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Java server - Parametry serveru
Všechny články v sekci
Server pro klientské aplikace v Javě
Přeskočit článek
(nedoporučujeme)
Java server - Vlákno serveru
Článek pro vás napsal Petr Štechmüller
Avatar
Uživatelské hodnocení:
2 hlasů
Autor se věnuje primárně programování v Javě, ale nebojí se ani webových technologií.
Aktivity