UvodDoKomponent: ParkovisteSpringDM |
from Wiki KIVu |
Implementace ve Spring DM vychází z ParkovisteOsgi. Odstranili jsme ale Activatory a přidali jsme Springové konfigurační soubory. Proto zde budou informace pouze k těmto konfiguračním souborům. O eventách si přečtěte v ParkovisteOsgi.
Springové konfigurační soubory musíme vytvořit s dvěmi XSD namespacy - beans a osgi.
V každém bundlu se samozřejmě vytvoří jedna beana, která se pak musí zaregistrovat podobně jako Konfigurace.
<osgi:service id="KonfiguraceZarizeniService?" ref="KonfiguraceZarizeni?" interface="cz.zcu.kiv.cosi.parkoviste.konfigurace.IKonfigurace?" />
Každá služba se pak samozřejmě musí získat, aby se mohla použít. Podobně jako Konfigurace.
<osgi:reference id="KonfiguraceZarizeni?" interface="cz.zcu.kiv.cosi.parkoviste.konfigurace.IKonfigurace?" />
A pokud chceme tuto referenci použít jako konstruktorový argument, musíme použít následující zápis <constructor-arg ref="reference"/>
, protože jinak mi Spring DM házel chybu.
<bean id="Parkoviste"
class="cz.zcu.kiv.cosi.parkoviste.parkoviste.Parkoviste">
<constructor-arg ref="KonfiguraceZarizeni?"/>
</bean>
Abychom mohli používat eventy, musíme si zavolat službu na rozhranní EventAdmina?. Provede se to naprosto stejně, jako volání jakékoliv jiné služby v Spring DM. Tedy:
<osgi:reference id="EventAdmin?" interface="org.osgi.service.event.EventAdmin?" />
Protože konfigurační soubory nahrazují Activatory a v těch jsme si registrovali listenery, určitě budeme muset něco registrovat i zde.
Při registraci EventHandlera? jsme v Activatoru používali vytvořenou instanci listeneru a parametry.
Zde tedy použijeme referenci na beanu (což je vlastně ta instance listeneru).
A parametry službě nastavíme pomocí vnořeného uzlu <osgi:service-properties>
, do kterého se vkládají parametry obdobně jako do hashovací tabulky, tedy pomocí <entry key="klic" value="hodnota" />
<osgi:service id="BranaListenerService?" ref="Brana" interface="org.osgi.service.event.EventHandler?" > <osgi:service-properties> <entry key="event.topics" value="parkoviste/plne" /> </osgi:service-properties> </osgi:service>
Stejně jako v OSGi implementaci, i zde Brana implementuje dvě rozhranní - IZapVyp? a IPrijeloOdjelo?.
V OSGi jsme se však nemuseli starat o způsob registrace služby. Zaregistrovali jsme ji na IZapVyp?, ale bez problému šla přetypovat i na IPrijeloOdjelo?.
To však ve Spring DM nejde. <osgi:service>
totiž odešle beanu pouze s tou informací, že jde o rozhranní, pod kterým jsme službu zaregistrovali. Přetypovat pak nejde.
Musíme ji tedy zaregistrovat pod několik rozhranní, jako v následujícím příkladu. Využijeme uzlu <osgi:interfaces>
<osgi:service id="BranaService?" ref="Brana"> <osgi:interfaces> <value>cz.zcu.kiv.cosi.parkoviste.konfigurace.IZapVyp?</value> <value>cz.zcu.kiv.cosi.parkoviste.brana.IPrijeloOdjelo?</value> </osgi:interfaces> <osgi:service-properties> <entry key="type" value="brana" /> </osgi:service-properties> </osgi:service>
Podobně jako v OSGi i zde můžeme použít filtr, když máme na jednom rozhranní zaregistrováno více služeb. Použití je ještě jednodušší - použije se atribut filter="(pravidlo)"
<osgi:reference id="Brana"
interface="cz.zcu.kiv.cosi.parkoviste.konfigurace.IZapVyp?"
filter="(type=brana)" />