Při brouzdání diskuzemi na webu občas narazím na názor, že systém provázání objektů v aplikaci založené na rámci Spring prostřednictvím návrhového vzoru Inversion of Control je zbytečná práce navíc.
V rámci Spring je tento návrhový vzor aplikován takto:
Mějme následující dvě deklarace singleton objektů (ve webové aplikaci typicky kontroler a business třída, ale totéž se týká například dvojice business třída a DAO třída):
<bean id="someController" class="cz.morosystems.SomeController" > <property ref="someService" /> </bean> <bean id="someService" class="cz.morosystems.SomeService" />
Třída SomeController tedy vypadá takto:
public class SomeController implements Controller { private SomeService someService; public void setSomeService(SomeService someService) { this.someService = someService; } //... }
Kritici argumentují tím, že XML deklarace business objektů, které kontroler využívá, musí být stále ve shodě se skutečnými závislostmi tak, jak jsou uvedeny v kódu. Při vývoji ovšem často dochází k přidání závislosti (business objektu) do kódu kontroleru a často se pak také zapomíná na změnu deklarace v XML. U klasické Spring + Hibernate aplikace pak dochází ke rvání vlasů těchto kritiků těmito kritiky, neboť zmíněné přehlédnutí znamená pád aplikace při reloadu ve webovém kontejneru a u složitější aplikace ztrátu třeba i minuty času. Již po několika desítkách takovýchto přehlédnutí pak vlasuprostý kritik atakuje nejbližší Spring community fórum svými stížnostmi, čemuž se nelze divit.
Spring ovšem obsahuje jednoduchý nástroj, jak se zmíněným obtížím vyhnout. XML deklaraci závislého objektu (kontroleru) lze upravit takto:
<bean id="someController" class="cz.morosystems.SomeController" autowire="byName" />
Díky přidání atributu autowire s hodnotou byName analyzuje kontejner Spring všechny JavaBeans vlastnosti kontroleru a pro každou z nich se pokusí mezi ostatními deklaracemi vyhledat ten bean, jehož id se shoduje s názvem vlastnosti, a tento bean kontroleru nastavit jako závislost.
Máme-li tedy například v aplikaci deklarováno několik servisních objektů a řádově desítky kontrolerů, které využívají různé servisní objekty, tak to, že není třeba upravovat XML deklaraci při jakékoliv změně závislosti v některém z kontrolerů, může být značnou úsporou času a nervů (a vlasů).
Tuto zkušenost jsme samozřejmě udělali i my a já považuji překonání tohoto problému za velmi výrazné zefektivnění našeho vývojového procesu. Snad tedy příjde tato rada k duhu i někomu dalšímu.
Poslední komentáře