UvodDoKomponent: Spring |
from Wiki KIVu |
První verze Springu je od Roda Johnsona a vyšla zároveň s knihou Expert One-on-One J2EE Design and Development, která popisuje základní filosofii Springu.
Pozor! Spring má jedinou implementaci a tak se obecně moc nerozlišují pojmy model a framework. Protože se všude mluví o Springu, jako o frameworku, můžeme říct že "Spring model = Spring framework". Mějte však na paměti, že framework je implementace modelu.
Spring se skládá z tříd a metod, které jsou rozděleny do 20ti modulů. Tyto moduly se slučují do částí Data Access/Integration, Web, AOP (Aspect Oriented Programming), Instrumentation, Core Container a Test, jak je vidět na obrázku níže
Stručně o jednotlivých modulech:
Pro více informací k jednotlivým modulům se můžete podívat na dokumentaci Springu.
Základem je konfigurační Springový soubor. Jde o klasický XML soubor, který však používá jmenný prostor Springu. Hlavička takového XML vypadá následovně:
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" /> </beans>
Obsahem takového souboru jsou beany, které vznikají při vytvoření kontextu. Kontext vytvoříme následovně:
ApplicationContext ctx = new ClassPathXmlApplicationContext("cz/zcu/kiv/project/beanDefinition.xml");
Pak už můžeme od kontextu požadovat potřebné beany.
Bean je ve světě Springu to samé, co objekt. Beany jsou objekty popsané v konfiguračním souboru Springu jako elementy.
<beans> <bean id="foo" class="x.y.Foo"/> </beans>
Spring podporuje DI dvěma hlavními způsoby – DI konstruktoru a DI setteru.
Mějme třídu:
package x.y; public class Foo { private Baz baz; public Foo(Bar bar) { // ... } public void setBaz(Baz baz) { this.baz=baz; } }
DI pak nastavíme ve Springovém XML konfiguračním souboru:
<beans> <bean id="foo" class="x.y.Foo"> <constructor-arg ref="bar"/> <property name="baz" ref="baz"/> </bean> <bean id="bar" class="x.y.Bar"/> <bean id="baz" class="x.y.Baz"/> </beans>
Spring pak při vytváření volá konstruktor s parametry, které jsou v <construtor-arg>
. Následně zavolá metody setName(hodnota)
, které jsou v <property>
, přičemž setter se musí jmenovat dle hodnoty name
a jako hodnota se vkládá buď přímo pomocí atributu value
, nebo jako reference na objekt pomocí atributu ref
.
Ve Springu je komponenta abstraktní a pro začátečníka je rozdíl mezi objektem, beanou a komponentou prakticky nulový. Odlišnost je pouze v pohledu na věc (beanu) a její použití.
Ukažme si tedy jak vypadá komponenta ve Springu:
Mějme třídu x.y.Foo
, která implementuje rozhraní x.y.IFoo?
. Tato třída nechť je komponentou a implementované rozhraní je rozhraním této komponenty.
V následující části XML konfiguračního souboru si ukážeme vytvoření komponenty x.y.Foo
a její následné získání další komponentou x.z.Fuu
.
<beans> <bean id="foo" class="x.y.Foo"/> <bean id="fuu" class="x.z.Fuu"> <constructor-arg type="x.y.IFoo"> <ref bean="foo"/> </constructor-arg> </bean> </beans>
Jak je vidět v ukázce výše, tak jsme komponentu injektovali do konstruktoru. Samozřejmě ji můžeme i získat z kontextu někde v těle komponenty x.z.Fuu
.
Poznámka: Při psaní tohoto úvodu jsem narazil v dokumentaci Springu na několik odkazů na komponentu – notace @component
ve zdrojovém kódu nad jménem třídy. Či v XML konfiguračním souboru jako <component>
. Nepodařilo se mi však najít žádné uchopitelné informace, které by mi pomohly zjistit k čemu tyto notace slouží.
Řekli jsme si, že se u Springu nerozlišují důsledně pojmy model a framework. My však víme, že model je specifikace a popis. Framework je implementací dané specifikace.
Komponentou je pak ve Springu beana, která implementuje alespoň jedno rozhraní. Co komponenta poskytuje, pak mohou být tato implementovaná rozhraní, a co komponenta potřebuje, mohou být atributy konstruktoru. Zde je velice důležité slovíčko mohou, protože stejně jako v OSGi i zde mohu získat komponenty z kontextu za běhu programu. Ovšem narozdíl od OSGi zde nemám žádné metainformace, které by mi řekly, co budu za běhu potřebovat.
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á.
TutoriálSpring pro vytvoření nového projektu pro práci se Springem.
HelloWorldSpring využívající Springového kontextu. Výsledná implementace: Attach:HelloWorldSpring
Příklad MessagePrinterSpring pak dokumentuje jen technologicky specifické problémy. Výsledná implementace: Attach:MessagePrinterSpring
Příklad ParkovisteSpring pak dokumentuje jen technologicky specifické problémy. Výsledná implementace: Attach:ParkovisteSpring