IoC ako vsetci vieme je Inversion of Control design pattern, ktory tu uz
istu dobu existuje a dovolim si tvrdit exte pred samotnym springom
(http://en.wikipedia.org/wiki/Inversion_of_control). Spring sa tohto
patternu chytil a postavil nad nim svoj IoC kontainer, ktory okrem IoC
medzi beanmi poskytuje rozne sluzby.
Pod IoC chapem redukciu zavislosti medzi dvomi beanmi, tak ze jedna
pozna maximalne interface tej druhej a o samotne vytvorenie zavislosti
sa postara tretia osoba (kontainer).
to co popsal Fowler byl samozrejme jenom zaklad, bezne pozadavky pri
rogramovani jdou za nej.
Kedze IoC preslavil spring nakolko je nad nim postaveny, tak si viem
predstavit ze spring evangelisti chapu pod IoC to co maju v dokumentacii
springu v kapitole IoC uvedene.
ty veci, ktere jsem vyjmenoval pri programovani potrebujes, Fowler o
nich nepsal protoze to nebylo potreba. Rekneme, ze to jsou aplikacni
pozadavky.
- nemuzes pouzit factory metody ci Factory jako takove
Faktory metod je tiez design pattern spisany uz v 1995 GoF a v jave ho
mozem pouzit aj bez springu aj bez J2EE kontaineru
jinymi slovy ti EJB enforcuje navrh objektoveho modelu. Ja chci mit
Factory z nejakeho duvodu a zarooven chci, aby mi na ni IoC kontejner
delegoval *vytvareni* (pouze) objektu. V IoC EJB neresitelnmy problem...
Tenhle pozadavek je celkem bezny pokud zacnes dohromady integrovat tvuj
kod a kod nejakych knihoven tretich stran.
- vsechny tvoje objekty *musi* mit rozhrani tj. nemas moznost volby
To ze bean anotujem napriklad @Statefull a tym sa stava managovany
kontainerom povazujem skor za vyhodu pre samotny bean, pretoze moze
vyuzivat sluzby kontaineru. O hranici kedy ma byt bean manazovany
kontainerom som pisal v predchadzajucom maily.
to mluvis o necem jinem, o tom jak se stane objekt managovany. Ja rikam
ze v EJB musi mit kazdy managovany objekt rozhrani - opet EJB
enforcement do tvoji architektury
- zavislost nelze injectnout konstruktorem
Konstruktor injection naozaj J2EE kontainer nema. Dovodom asi bude ze je
menej pouzivana ako setter injection.
:-) cili EJB opet enforcuje to, ze nesmis pouzit konstruktor
- chybi extension pointy na strane IoC kontejneru (z pohledu Spring
BeanPostProcessor)
Lifecycle metody mozes v EJB definovat tiez (@PreCreate), ale to sme od
IoC design patternu daleko
ano to muzes, ale uz nemuzes napriklad rici co se ma stat s takhle
inicializovanym objektem. Predstav si, ze jej potrebujes nekam
zaregistrovat.
- nemuzes pouzit autowiring (velice uzitecne pro testy)
Pri developmente nepouzitelne - stracas prehlad
rpo vyjadreni klasickych zavislosti ne, ale pri testech je to vice nez
uzitecne. Je tak mozne, ze si nadefinujes test a IoC kontejner ti pak do
nej injectne testovany objekt.
public FooTest extends AbstractDependencyInjectionSpringContextTests {
private Foo foo;
public void testFoo(){
assert(foo.doSomething());
}
public void setFoo(Foo foo){
this.foo = foo;
}
}
- nemuzes definovat neprime zavislosti
Tomuto poslednemu bodu nerozumiem
mas dve beany A a B, ktere na sobe nejsou explicitne zavisle (nemaji
primou dependency) a potrebujes, aby bylo napriklad zarucene, ze IoC
kontejner nejdrive zinicializuje beanu B a teprve potom beanu A.
Ak teda porovnavame IoC, tak porovnavajme to co naozaj IoC je
http://www.martinfowler.com/articles/injection.html.
my (ja) porovnaveme prakticke pozadavky, ktere aplikace ma, pokud se
rozhodne IoC prijmout ;-). Vsechny ty pozadavky vychazeji z pripadu
uziti IoC v praxi a to v nasich produktech.
--
S pozdravem Roman "Dagi" Pichlik
/* http://www.sweb.cz/pichlik/ Blog pro kodery */