UvodDoKomponent: DeclarativeServices |
from Wiki KIVu |
Je nejpodobnější Spring DM.
Myšlenkou Declarative Services je rozšíření OSGi, aby byla jednodušší správa služeb. DS nám rovněž ve snadno přístupném konfiguračním souboru odkrývá všechny služby, které zveřejňuje a které potřebuje.
Je vhodné přečíst si kapitoly o Springu a OSGi
V tomto případě už snad ani nejde mluvit o frameworku jako u Spring DM. DS nám totiž poskytuje pouze lepší práci se službami. Mluvme tedy o DS jako o rozšíření OSGi frameworku. V tomto případě tedy můžeme vynechat i všechny další komponentové pojmy, protože ty zůstávají stejné jako u OSGi.
Je přidán nový konfigurační soubor. Vedle META-INF/MANIFEST.MF
je zde ještě OSGI-INF/konfSoubor.xml
. Jméno tohoto konfiguračního souboru není pevně dáno.
Využívá se nový namespace, který přímo reprezentuje komponentu - bundle.
<implementation>
: lze určit, jaká je hlavní (spouštěcí) třída => opět se nemusí používat activator.
<service>
: zde se registrují služby
<provide>
: určí na jaké rozhranní se má služba zaregistrovat
<property>
: nastaví property zveřejněné službě
<reference>
: získá a naváže službu na metodu, která si získaný interface dále zpracuje
Ukázka:
<?xml version="1.0" encoding="UTF-8"?> <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" immediate="true" name="ParkovisteDSPult"> <implementation class="cz.zcu.kiv.cosi.parkoviste.pult.Pult"/> <service> <provide interface="org.osgi.service.event.EventHandler"/> </service> <property name="event.topics" value="parkoviste/*"/> <reference bind="setStatistika" cardinality="1..1" interface="cz.zcu.kiv.cosi.parkoviste.brana.IPrijeloOdjelo" name="IPrijeloOdjelo" policy="dynamic"/> </scr:component>
V těchto návodech pracuji s SpringSource Tool Suite, které je trochu odlišné od Eclipsu. Většina věcí je však stejná.
Declarative services není plnohodnotný framework, ale pouze rozšíření OSGi. Při implementaci příkladů jsem vzal kompletní funkční část z OSGi - ale bez Activatorů. To je vlastně téměř jediný rozdíl v kódu oproti Osgi. Declarative Services umí vlastně úplně to samé jako SpringDM, pouze používá jiný přístup.
Místo activatorů jsou zde komponentové xml soubory.
TutoriálDeclarativeServices na vytvoření nového projektu.
Jednoduchá implementace HelloWorld. Výsledná implementace: Attach:HelloWorldDS
Příklad MessagePrinterDS pak dokumentuje jen technologicky specifické problémy. Výsledná implementace: Attach:MessagePrinterDS
Příklad ParkovisteDS pak dokumentuje jen technologicky specifické problémy. Výsledná implementace: Attach:ParkovisteDS
1) Jakmile u komponenty registruji <service>
, komponenta se okamžitě stává delayed
, což znamená, že nebude nic dělat, dokud někdo nebude registrovanou službu chtít - pak teprve dojde k vytvoření dané komponenty.
2) Pokud chci spouštět komponentu s registrovanou službou okamžitě (mám v ní metodu activate), musím nastavit <scr:component immediate="true" ...>
3) Je třeba si dávat pozor, na obsah definičního souboru - každá drobnost může způsobit nefunkčnost a nehlásí žádnou chybu.
4) I když je nastaven okamžitý start u komponenty, která registruje službu (například EventHandler?), služba se prostě nezaregistruje. Něco takového asi prostě není možné :)