nemelo by byt v deklaraci misto:
<bean id=„nejakyManazer“ class=„cz.neco.NejakyManazer“ >
toto?:
<bean id=„nejakyManazer“ class=„cz.neco.NejakyManazerImpl“ >
Pokud ne, tak muzete mi vysvetlit, proc tomu tak neni? Dik.
Obsah
Klíčovým pojmem celé architektury aplikačního rámce Spring je tzv.
továrna tříd (bean factory), reprezentovaná rozhraním
org.springframework.beans.factory.BeanFactory.
Továrna tříd má na starosti základní funkcionalitu rámce
Spring™, tedy zejména provázání objektů pomocí
DI a transparentní aplikaci služeb rámce (transakce
atd.) pomocí AOP.
Továrna tříd po svém startu drží objekty spravované aplikace, vzájemně je prováže a poskytuje odkazy na tyto objekty svým klientům. To, které objekty jsou továrnou tříd spravovány, je definováno většinou prostřednictvím konfiguračního souboru ve formátu XML. Lze použít i jiné formáty, například tzv. properties soubor, ale zdaleka nejrozšířenější jsou XML soubory, takže i my se tohoto formátu v dalším textu přidržíme.
Příkladem deklarace spravovaných objektů může být následující ukázka kódu:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="nejakeDao" class="cz.neco.NejakeDaoImpl" />
<bean id="nejakyManazer" class="cz.neco.NejakyManazer" >
<property name="konf" value="nejakaHodnota" />
<property name="dao" ref="nejakeDao" />
</bean>
</beans>
Předpokládejme tedy existenci následujících tříd a rozhraní:
interface NejakeDao {}
class NejakeDaoImpl implements NejakeDao {}
interface NejakyManazer {}
class NejakyManazerImpl implements NejakyManazer {
private NejakeDao dao;
private String konf;
public void setDao(NejakeDao dao) {
this.dao = dao;
}
public void setKonf(String konf) {
this.konf = konf;
}
}
V tomto případě by kontejner použil DI variantu Setter Injection a prostřednictvím reflexe provedl kód ekvivalentní tomuto:
NejakeDao nejakeDao = new NejakeDaoImpl();
NejakyManazer nejakyManazer = new NejakyManazerImpl();
nejakyManazer.setKonf("nejakaHodnota");
nejakyManazer.setDao(nejakeDao);
Chceme-li tedy používat Setter Injection, pak všechny spravované třídy naší aplikace musí dodržovat formát JavaBeans™, především tedy musí obsahovat veřejný bezparametrický konstruktor a veřejnou set metodu k nastavovanému atributu.
Pokud bychom chtěli využít DI variantu Constructor Injection, pak bychom museli náš konfigurační soubor poupravit takto:
<beans>
<bean id="nejakeDao" class="cz.neco.NejakeDaoImpl" />
<bean id="nejakyManazer" class="cz.neco.NejakyManazer" >
<constructor-arg value="nejakaHodnota" />
<constructor-arg ref="nejakeDao" />
</bean>
</beans>
Také spravovaná třída
cz.neco.NejakyManazerImpl by musela vypadat
trochu jinak:
class NejakyManazerImpl implements NejakyManazer {
private NejakeDao dao;
private String konf;
public NejakyManazerImpl(NejakeDao dao, String konf) {
this.dao = dao;
this.konf = konf;
}
}
Je vidět, že v případě Constructor Injection může továrna tříd rámce Spring™ spravovat v podstatě jakékoliv třídy, což může být užitečné například v případě, že chceme pomocí rámce Spring™ spravovat třídy třetích stran, které formát JavaBeans™ nedodržují. Obě varianty DI lze v rámci celého kontejneru, ale i téže třídy libovolně kombinovat.
Nastavení atributu konf řetězcového typu
třídy NejakyManazerImpl ilustruje konfigurační
možnosti rámce Spring™. Stejným způsobem lze
inicializovat hodnoty atributů ostatních primitivních typů. Nastavení
atributu dao třídy
NejakaSluzbaImpl naopak ukazuje, jakým způsobem
lze využít Spring™ pro provázání
objektů.
Pojmenujeme-li vytvořený definiční soubor
kontext.xml a umístíme-li jej do classpath, pak
továrnu tříd (kontejner) nastartujeme například takto:
BeanFactory beanFactory = new XmlBeanFactory("/kontext.xml");
Vytvořený
objekt s id nejakyManazer
získáme z kontejneru voláním:
NejakyManazer manazer = (NejakyManazer)beanFactory.getBean("nejakyManazer");
komentoval: Michal Kolesar [www.zeleny-ctverec.cz], dne: 20. 07. 2008, 11:21
nemelo by byt v deklaraci misto:
<bean id=„nejakyManazer“ class=„cz.neco.NejakyManazer“ >
toto?:
<bean id=„nejakyManazer“ class=„cz.neco.NejakyManazerImpl“ >
Pokud ne, tak muzete mi vysvetlit, proc tomu tak neni? Dik.
komentoval: Tomáš Páral [http://morosystems.cz], dne: 20. 07. 2008, 13:40
Dobrý den, ano, máte pravdu, mělo byt to být, jak píšete. Děkujeme za upozronění.
Můžete používat značkovací jazyk Texy!