problem je v tom, ze jakmile zacnes pouzivat static pristup, tak
zivotni cyklus tveho objektu a toho jak s nim naklada IoC kontejner je
diametralne odlisny. Statickou metodu pro vraceni instance toho
singletonu muze volat kdokoliv kdykoliv bez ohledu na fakt, jestli uz
IoC kontejner udelal na tom objektu vsechnu svoji praci napr. nastavil
dependence. To potom vede k tomu, ze system padne nekde uplne jinde na
NPE v zavislosti na tom, jestli ve chvili volani byla instance
singletonu vytvorena.

Dalsi nevyhoda singletonu je v tom, ze ackoliv je to managovana beana,
lidi ji pouzivaji jako singleton. Misto toho, aby byl ten objekt nekam
injectnuty se na tom miste pozuije klasicke volani staticke metody.
Muzu mit tedy dve beany, ktere na sobe neprimo zaviseji pres singleton
a opet muze dojit k tomu, ze se nevytvori ve spravnem poradi.

To co v tom dokumentu chybi, a bude doplneno, je fakt, ze ve chvili
kdy clovek zacne pouzivat singleton jako takovy, tak zacne zavadet do
sveho systemu opet tesne vazby mezi objekty. Zavislost na singletonu
proste nezmenim v konfiguraci, ta je zapecena uvnitr kodu. Napriklad
chci misto singletonu pro testy injectnout mock object, jak to mam
udelat?


2008/10/10 Jiří Mareš <[EMAIL PROTECTED]>:
>
> Ahoj Dagi,
>
> priznam se, ze dokument mi na tema proc nepouzivat singletony neodpovedel. 
> Kde je tedy problem, ja jen nevidim ...
>
> Diky
>
> jira
>
> PS. Pod pojmem singleton nemyslim staticke metody a statickou instanci ve 
> tride, ale nastaveni v xml atribut
> singleton="true" (podobne jako tazatel).
>
> Roman Pichlík napsal(a):
>> Pokud neni uvedeno jinak, tak IoC kontejner vytvari vsechny managovane
>> objekty (beany) v singleton modu. To znamena, ze na kontejner pripada
>> pouze a jenom jedna instance daneho objektu. Jinak navrhovy vzor
>> singleton je v prostredi, kde se pouziva iversion of control, spise
>> antivzorem a vede to k problemum popsanym v tomto dokumentu
>> http://docs.google.com/Doc?id=dn53qgm_7g69mtccp. Myslite
>>
>> Takze singletony v zadnem pripade nedelat!
>>
>> Hibernate session a nebo HTTP session?
>>
>
>>> Zdravím konferenci
>>>
>>> Ve webové aplikaci používám Struts + Spring + Hibernate.
>>> Pro načítání dat požívám klasickou DAO vrstvu.
>>> DAO třídy si přes applicationContext Springu vstříkuji ( injection ) do 
>>> tříd s aplikační logikou (Action class ve Struts).
>>> DAO třída obsahuje klasické CRUD operace.
>>>
>>> Dotaz:
>>> Mohu nastavit DAO třídy jako singletony? Mám pocit, že by mi to mohlo 
>>> ušetřit nějaké zdroje, ale nejsem si jistý zda je to bezpečné z hlediska 
>>> concurrency přístupů.
>>>
>>> Ve webové aplikaci by měly být přístupy k objektům ThreadSafe, ale četl 
>>> jsem o nějakých vyjímkách (např. session).
>
> --
> Jiří Mareš (mailto:[EMAIL PROTECTED])
> ČSAD SVT Praha, s.r.o. (http://www.svt.cz)
> Czech Republic
>
>



-- 
S pozdravem Roman "Dagi" Pichlik

/* http://www.sweb.cz/pichlik/ Blog pro kodery */

Odpovedet emailem