28. února 2008

Způsoby konfigurace Springu

Když se mluví o Springu, tak to má hned každý spojený s tím, že se vše konfiguruje pomocí XML. Pravděpodobně je to kvůli tomu, že opravdu v minulosti (do verze 2.0) nebyla jiná schopná možnost konfigurace, ale to již dneska v žádném případě neplatí.

Jakými způsoby můžeme tedy konfigurovat springovské aplikace?

XML

Vždy aspoň trochu té konfigurace v XML budeme potřebovat, minimálně říci, že budeme konfigurovat např. pomocí anotací. Já osobně mám konfiguraci v XML celkem rád, protože vše mám vytažené na jedno místo, hned vidím všechny ty možné závislosti. V porovnání s anotacemi nemusím skákat mezi třídami a zjišťovat, jak je to vše vlastně propojené. To má podle mě také výhodu s ohledem na úpravu konfigurace. Na druhou stranu musím uznat, že někdy je to "až moc upovídané" - to se částečně zlepšilo s nástupem namespaců. Nejvíce mi to přijde upovídané ve webové vrstvě okolo kontrolerů, tak jsem tuto část aplikace začal konfigurovat pomocí anotací.

Anotace

Od druhé verze Springu je možné používat anotace. Anotace jsou v poslední době "sexy", takže tento styl se bude využívat asi hodně často. Spring se také snaží držet hesla "convention over configuration", což ve spojení s anotacemi vytváří velice rychlý a efektivní způsob konfigurace. Jak už jsem zmiňoval, velice se mi toto osvědčuje pro webovou vrstvu aplikace.

Java konfigurace

Tento způsob konfigurace není standardní součástí Spring frameworku, ale je vyvíjen bokem jako Spring Java Configuration Project. Tento způsob bych asi použil tehdy, když bych potřeboval mít dynamicky měnící se konfiguraci, tj. za běhu např. měnit nastavení parametrů připojení k databázi. Výhodou určitě také je to, že vše je v Javě - máme doplňování kódu, kontroly syntaxe a všeho možného, refaktoring.
Zdá se mi ale, že tento projekt se nějak zastavil. Pamatuji si na několik přednášek na konferenci SpringOne v červnu minulého roku, kde toto prezentovali jako novinku a zajímavou možnost do budoucna. Je o devět měsíců později a projekt je pořád ve stejném stavu. Myslím si, že přeci těch způsobů konfigurace je celkem dost a že malinkato se to překrývá s projektem Spring dynamic modules.

Properties

Hned na začátku říkám, že nemám na mysli využití PropertyPlaceholderConfigurer, ale PropertiesBeanDefinitionReader . Jedná se tedy o způsob konfigurace pomocí properties souborů.
Tento způsob konfigurace je ve Springu už asi jen z historických důvodů, na nových projektech tento způsob už asi nikdo nepoužije.


Na závěr bych dodal, že jednotlivé způsoby konfigurace lze libovolně křížit, pro určitou část můžeme použít anotace, pro jinou XML apod.
Volba způsobu konfigurace závisí na každém z nás, každý preferuje jiný způsob. Proto mi přijde celkem nefér, že se často vytýká Springu jeho upovídanost, protože je to každého věc a pokud budu chtít, tak té konfigurace bude opravdu minimum.

Články k příspěvku:
More on Java Configuration
Spring Java Configuration Moving Ahead

3 komentáře:

Honza Novotný řekl(a)...

Trochu bych polemizoval s tvrzením o použití konfigurace z properties:

"Tento způsob konfigurace je ve Springu už asi jen z historických důvodů, na nových projektech tento způsob už asi nikdo nepoužije."

Tento způsob stále používáme a používat budeme i nadále. Faktem je, že v těchto "property" souborech máme minimum konfigurace (typicky pouze konfiguraci pro připojení k databázi, adresu smtp serveru atp.). Typicky se jedná jen o konfigurační údaje, které se s každou novou instalací liší - je nutné je oeditovat nebo minimálně zkontrolovat.

Pokud aplikaci nasazuje někdo jiný, než autor aplikace je pro něj daleko jednoduší oeditovat tyto malé property soubory, než analyzovat XML soubory springu. Property soubory navíc umí oeditovat i ne Java programátor.

Proto si myslím, že z tohoto hlediska budou property využívány i nadále - ale je pravda, že je jedná jen o "okrajový" způsob konfigurace.

BTW: díky za článek.

Petr Jůza řekl(a)...

Ted nevím, zda jsme se úplně pochopili.
My také pořád používáme properties soubory, ale pouze k nastavení konkrétních údajů, např. jak píšeš pro připojení k DB, pro nastavení cest apod. Jinak řečeno, aby ty nastavitelné údaje byly vytaženy někam mimo.
Ale v tom článku jsem měl na mysli přímo konfiguraci pomocí properties souborů. Např. vytvoření beans, vytvoření závislostí mezi nimi apod., tak jak to mohu dělat třeba pomocí XML. Rozdíl je vidět při pohledu na dokumentaci ke třídě PropertiesBeanDefinitionReader.

Honza Novotný řekl(a)...

Ehm, chyba samozřejmě na mojí straně - přehlédl jsem větu "Hned na začátku říkám, že nemám na mysli využití PropertyPlaceholderConfigurer". A pochopil jsem to přesně naopak. Měl jsem si ráno víc promnout oči ;).