Inversion of Control and Dependency Injection

Z FI WIKI
Přejít na: navigace, hledání
This page is also available in English: Inversion of Control and Dependency Injection (English)

Motivácia

Kedysi sa programy samotné používali na kontrolu všetkých aspektov funkcionality. Príkladom takéhoto chovania je napríklad užívateľské rozhranie(UI - user interface). Programy mávali sekvenciu príkazov, ktoré zakaždým invokovali event handlery napísané priamo do programu(preklad, Fowler 2012). Aplikačné rámce(anglicky frameworks) užívateľských rozhraní mávali obrovské množstvo takýchto handlerov, ktoré bežali v hlavnom cykle programu.

Trendom dneška v aplikačných rámcoch je odvrátenie kontroly zo samotného rámca do kontajneru, odkiaľ pochádza aj termín Inversion of control(IoC). Vývojári stále musia poskytnúť všetku funkcionalitu, ale dnes im na to často stačí použitie jednej jednoduchej anotácie. Štruktúra programu sa takto stáva prehľadnejšou a IoC prináša aj možnosť lepšieho rozbíjania závislostí. Pri IoC dochádza k vytváraniu závislostí až počas behu programu a tieto závislosti typicky nie sú známe v čase kompilácie.

Termín Dependency Injection a jeho význam

Inversion of Control je veľmi všeobecný termín, ktorý nie je jasný a množštvo ľudí je z neho zmätených. Na tento fakt reagoval Martin Fowler a po konzultácii tejto problematiky s rôznymi expertmi sa v roku 2004 zhodli na termíne Dependency Injcetion(http://www.martinfowler.com/bliki/POJO.html, voľný preklad by bol asi injektovanie závislostí). Tento termín je podľa nich oveľa jasnejší, pretože aplikačný rámec injektuje potrebnú funkcionalitu(závislosť) presne tam, kde je potrebná a programátor špecifikuje iba čo a kde chce nainjektovať.

Toto môže byť vykonané jednoduchým kódom ako napríklad:

 
 
    Player player = 
         (Player) container.lookup("Player");
 

Avšak od Javy 1.5(Java SE5) je umožnené aj použitie anotácií:

                  
    @Autowired

V každom prípade kontajner(aplikačný server v prípade použitia Springu alebo EJB kontajner) vyhľadá potrebnú implementáciu a zavedie ju, čím zjednodušuje vývojový proces a zjednodušuje slovnú rozvláčnosť kódu.

Odkazy

M. Fowler. Patterns of Enterprise Application Architecture. Addison-Wesley Signature Series. Pearson Education, 2012.

Martin Fowler. Inversion of contorl and dependency injection. http://martinfowler.com/articles/injection.html, 2013.