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 26x (142.19 kB)
Aplikace je včetně zdrojových kódů v jazyce Java