Vánoční nadílka Vánoční nadílka
Vánoční akce! Daruj lepší budoucnost blízkým nebo sobě. Až +50 % zdarma na dárkové poukazy. Více informací

Lekce 3 - Java server - Google Guice

Java Server pro klientské aplikace Java server - Google Guice

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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.


 

Stáhnout

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

 

 

Článek pro vás napsal Petr Štechmüller
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor se věnuje primárně programování v Jave, ale nebojí se ani webových technologií.
Miniatura
Předchozí článek
Java server - Parametry serveru
Miniatura
Všechny články v sekci
Server pro klientské aplikace v Javě
Miniatura
Následující článek
Java server - Vlákno serveru
Aktivity (2)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!