J2EE vzory: Inversion of Control a Dependency Injection
Na J2EE vzory Inversion of Control a Dependency Injection jsem narazil v souvislosti s
J2EE frameworkem či lightweight kontejnerem Spring.
Oba vzory popisují propojení aplikačních komponent a jsou jádrem právě kontejnerů jako zmiňovaný
Spring, PicoContainer nebo Avalon.
Inversion of Control
Vzor Inversion of Control zkráceně IoC řeší těsné vazby
mezi aplikačními komponentami, které jsou pevně provázány v aplikačním kódu. Řekněme, že máme
komponentu Acme, který využívá komponenty Foo a Hoo. Ve většine případů je vazba řešena přímo kódem,
ve kterém Acme instancuje komponenty Foo a Hoo.
class Acme ....
private Acme(){
foo = new Foo();
hoo = new Hoo();
}Nevýhoda tohoto kódu je v tom, že Acme je těsně svázáno s Foo a Hoo. Zvažme příklad, kdy budeme mít
komponentu FooBar, kterou budeme chtít použít místo Foo(Foo i FooBar implementují stejné rozhraní).
Budeme muset změnit kód a místo Foo instancovat FooBar, díky této provázanosti budou všechny
změny závislé na úpravě kódu a jeho zkompilování.
Tyto problémy řeší právě IoC(obrácená kontrola), kde jsou
komponenty provázány z vnějšku. Komponenta Acme(spotřebitel) nevytváří instance Foo a Hoo, ale instance
těchto komponent se jí nastaví z vnějšku.
class Acme ....
public void setFoo(FooInterface foo)..
public void setHoo(HooInterface hoo)..Nyní na řadu přicházejí ony zmíněné lightweight kontejnery, které ono nastavení z vnějšku realizují.
Provázanost tedy volba konkrétní instance se děje pomocí konfigurace, která bývá nejčastěji v XML.
Kontejner pak podle konfigurace řídí vlastní vytváření komponent a jejich nastavení. Obrácená kontrola
umožňuje vznik objektů na výše postavených vrstvách a jejich doručení přímo k jejich spotřebiteli.
Dependency Injection
Dependency Injection jde ruku v ruce s IoC a řeší
nastavení či doručení komponent k jejich spotřebiteli. Existují tři základní způsoby nastavení
Setter injection
Injekce se děje pomocí klasických setteru čili setovacích metod známých
například z modelu JavaBean. Tento způsob používá framework Spring.
Constructor injection
Injekce se děje přes konstruktor a používá ji framework PicoContainer.
Interface injection
Injekce přes rozhraní je realizována přes definici rozhraní, kterým se
provádí nastavení komponenty a typickým představitelem je framework Avalon.
Velká diskuse se točí kolem toho jaký způsob zvolit. Injekce skrz rozhraní stojí trošku na okraji
a tak se především diskutuje jestli je lepší použít settry nebo konstruktor. Obě mají své výhody a
nevýhody a nerad bych se pouštěl do jejich srovnání neboť to je na další článek.
Pokud Vás tato problematika zajímá tak mohu vřele doporučit následující zdroje, ze kterých
jsem čerpal.
- Rod Johnson Introducing the Spring Framework
- Martin Fowler Inversion of Control Containers and the Dependency Injection pattern
- Jirka Fabián Understanding the IoC Pattern
- Mark Eagle Wiring Your Web Application with Open Source Java
Související články
Související epizody CZ Podcastu
- #3 · Java 6 SE, Vývoj webových aplikací
Dagi a Filemon o novinkách v Javě 6 a webových frameworcích.
- #1 · Vývojová prostředí v Javě
První díl CZ Podcastu se věnuje vývojovým prostředím pro Javu.