středa 16. ledna 2013

Dependency Injection v Grails

Jedna z vlastností Grails je automatická podpora dependency injection (DI) service tříd ve Spring beanech napsané v Groovy (to jsou mimo jiné i controller, service, taglib nebo domain v Grails aplikacích). Stačí napsat jednoduše název dané service třídy, např. pokud mám UserService:

def userService

pak vše funguje automaticky (viz manuál Grails). Nikdy jsem ale nevěděl (ani jsem se o to nijak nezajímal), jak to vlastně funguje. Narazil jsem na to až v knize Programming Grails (MEAP verze, v době psaní článku je zdarma a legálně dostupné tu).

Podmínkou je, aby proměnná měla scope třídy a taky aby byla public. Pro public proměnné Grails automaticky převede na privátní proměnnou s getter a setter metody.

private Object userService

void setUserService (Object userService) {

    this.userService = userService
}

Object getUserService () {

    return userService
}

Protože Grails běží na Spring frameworku, má definován též ApplicationContext soubor, kde atribut autowire je nastaven na typ "byName". Což znamená, že pokud ve třídě bude k dispozici setter, který má jméno jako bean, tak se automaticky provede DI. To vede k dalšímu důsledku, kdy proměnná definovaná v rámci metody (lokální proměnná) nemůže mít DI, protože nesplňuje podmínky pro autowiring.

Žádné komentáře:

Okomentovat