EJB 3 – injektujeme SFSB

(aneb vstřikujeme zrnka sezení plná stavu)

Konečně jsem našel odpověď na otázku, která už mi dlouho ležela v hlavě. Přivedl mě na ni kolega, který na jednom firemním setkání Javistů někdy před rokem nadnesl otázku „Co se stane, když injektnu stateful session bean do servletu?“

Zajímavé co? Stejná otázka se samozřejmě nabízí i u stateless beanů. Co se stane, když něco co drží stav injektnu (vnesu??) do objektu, který je bezstavový.



@Statefull
public class Cart {
 ...
}

@Stateless
public class Shop
{
  @EJB private Cart cart;
  ...
}

Tak co, víte co se stane? Já už ano. Odpověď mi poskytla docela pěkná kniha EJB 3 in Action. Na straně 136 se dočteme:

Mějte na paměti, že nesmíte injektovat stateful session bean do bezstavového objektu, jako je stateless session bean nebo servlet, který může být sdílen více souběžně přistupujícími klienty (v takovýchto případech používejte JNDI)

Hurá, otázka zodpovězena. Jak tento problém řeší Spring? Ten sice nemá žádný ekvivalent SFSB, ale od verze 2 má tzv. scopy (rozsahy) beanů. Je tedy možné, injektnout bean, který se váže na HTTP session uživatele, do beanu, který je sdílen mezi všemi uživateli? Co se stane v tomto případě? Nenastane stejný problém jako u EJB? To je to ale napínavé co?

Nenastane! Springu totiž můžete říci, aby neinjektoval původní bean, ale proxy. Ta ohlídá aby každý uživatel (session) dostal svoji verzi i v kódu, který o scopu a stavech vůbec nic netuší. Tato proxy se také stará o vytvoření beanu, pokud je to potřeba. Více podrobností naleznete v dokumentaci Springu.

4 Responses to “EJB 3 – injektujeme SFSB”

  1. Ladislav Thon Says:

    > Springu totiž můžete říci, aby neinjektoval původní bean, ale proxy.

    Nemůžeme. Udělá to vždycky a automaticky 🙂 Na používání proxy je celá podpora rozsahů platnosti založena.

  2. Lukáš Křečan Says:

    Také jsem si myslel, že to funguje automaticky. Dokumentace ale mluví o opaku.

  3. Ladislav Thon Says:

    No ano, máte samozřejmě pravdu, už začínám blbnout... je to, na co jsem tak naivně zapomněl.

  4. kooudy Says:

    injekci EJB stateful do stateless pres @EJB jsem zkousel, injektne se, ale asi vzdy jina instance, jinak v SEAMu SFSB injektuju anotaci @In 🙂