Kapitola 2. Rámec Spring - jádro

Obsah

Továrna tříd
Aplikační kontext
Jedináček a prototyp
Atributy běžných typů
Externí datové zdroje
Odesílání e-mailů
Zdroje zpráv

Továrna tříd

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");

Komentáře

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­.NejakyManaze­rImpl“ >

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í.

Vložit komentář

Můžete používat značkovací jazyk Texy!


Jméno:
E-mail:
Url:
Komentář:
1 + 2 =
 
MoroSystems, s.r.o.