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 */
