Jak mám Spring rád a všude ho chválím, tak co se týče jejich certifikace, přijde mi, že to se svou nenažraností přehnali. Je normální, že programátorská zkouška stojí kolem 250 dolarů, ale podmiňovat to účastí na povinném, drahém kurzu, se mi zdá příliš. Naštěstí jedna z výhod práce v korporacích je, že na taková školení prostředky jsou. Sepsal jsem pár poznámek ze školení, které jsem absolvoval, i Spring certifikace, kterou jsem právě složil.

Školení

Samotné školení probíhalo online a trvá čtyři dny (náročné na pozornost, zíval i školitel), ale troufnu si tvrdit, že spíš potřebujete čtyři roky praxe. Podle mého názoru si mohli odpustit dlouhý úvod, obecný popis JPA, JMS, security, mocků… (to přeci musí každý senior programátor umět) a místo toho věnovat víc prostoru proxy nebo hierarchickým kontextům. Na druhou stranu jsem někde četl (pravděpodobně to byla novinářská poučka), že by se neměly přeceňovat znalosti a podceňovat inteligence publika. Čekal bych víc o podpoře Java 8. A poslední výtka, Java, i Spring, spějí k annotation hell. Naštěstí ukazují i xml, kterému osobně dávám přednost.

Příklady měli připravené pro cvičené opice, plné TODO, které jste měli doplnit. Přesto, kdo neumí s Eclipse nebo Mavenem, případně vidí Spring poprvé v životě, nemůže stíhat. Ovšem má možnost vypracovat je jako domácí úkoly, protože jsou k dispozici řešení. Prezentovali materiály už se Springem 4.1, ale my dostali jen verzi 4.0

Celkově mi školení přišlo výrazně kvalitnější než ta od Oraclu. Nejen materiály, ale hlavně tím, že školitel byl zkušený odborník.

Co jsem se naučil

Podepsal jsem NDAčko, že neprozradím, co bylo za otázky v testu. Nicméně chtěl bych se podělit o pár svých poznámek, ze kterých jsem se na certifikaci učil.

Jedna z klíčových tříd, respektive rozhraní, ve Springu je BeanFactoryPostProcessor. Tento post procesor může modifikovat definici bean. Nejznámější implementací je nejspíš PropertySourcesPlaceholderConfigurer. Oproti tomu BeanPostProcessor (přichází na řadu až po BeanFactoryPostProcessoru) může modifikovat instance bean před nebo i poté, co jsou inicializované. Jako příklad implementace uveďme CommonAnnotationBeanPostProcessor, který procesuje například anotace PostConstruct a PreDestroy. Pozor, PreDestroy se nevolá pro beany se scopem prototype. Navíc se volá jen v případě, kdy se JVM ukončí normálně. Pokud vás zajímá, jak toho dosáhli, podívejte se na AbstractApplicationContext#registerShutdownHook(), kde se využívá Runtime#addShutdownHook(Thread hook). V souvislosti s anotacemi, kterými můžete ověnčit definici beany, jsem úplně jsem zapomněl, že existuje anotace Required.

Schema version

K životnímu cyklu aplikačního kontextu ještě poznámka, že annotation injection se provede před xml injection. Obě metody lze totiž kombinovat a tohle pořadí vám umožňuje konfiguraci knihoven, jejíchž zdrojový kód nemáte pod kontrolou, ale potřebovali byste překrýt jejich konfiguraci definovanou anotacemi. K injektování prototype do singletonů slouží tzv. lookup method. V xml konfiguraci nemusíte u schématu uvádět verzi, použije se poslední, což vám usnadní upgrade.

Named pointcut

Je potřeba porozumět AOP. A to je dobře, protože se ve Spring frameworku hojně používá. Udělejte si jasno v termínech join point, pointcut (a jejich zápisu), advice, aspect, target a weaving. Je důležité znát i oba způsoby vytváření proxy: JDK pro interfacy a CGLib pro classy. Z použití AOP jsem si odnesl pěknou inspiraci Using Spring AOP to Retry Failed Idempotent Concurrent Operations. Pěkný „chyták“ i na zkušené programátory je situace, kdy metoda a() volá metodu b() na té samé třídě, tak se advice nezavolá (vysvětlení). Užitečný je koncept named pointcut, který vám pomůže odstranit duplicity v konfiguraci, viz obrázek.

Obvykle jsem dělal s větším mírou abstrakce než JdbcTemplate, takže se hodilo zopakovat si rozdíl mezi RowMapper (co řádek to objekt), RowCallbackHandler (void) a ResultSetExtractor (celý ResultSet najednou). Nikdy jsem zatím nevyužil TransactionDefinition#PROPAGATION_NESTED, tak mě ani nenapadlo, jak je to implementováno (jedna fyzická transakce s více safe pointy).

Spring 4 přináší ještě něco sofistikovanějšího než jsou profily a to anotaci Conditional. Verze 4.1 má další anotační novinku, Sql, pro spouštění skriptů v testech. Když už je řeč o testech, tak o anotaci @DirtiesContext jsem tušil, ale zatím nepoužil. Třída anotovaná @Configuration může být přímo součástí testovací třídy, ale musí být static.

Ke studiu můžete využít refcard Spring 4 – Annotation-Driven Dependency-Injection.

Certifikace

Jak už jsem se rozčiloval, kvůli certifikaci musíte absolvovat povinné školení. Ale nebývalo tomu tak vždy. Existovalo něco, čemu říkali Grandfather Criteria, kdy stačilo doložit příspěvek na fóru, patch, článek na blogu nebo zapojení do user groupy.

Je možné si za 40 USD zakoupit neoficiální ukázkové testy. Hodily se mi, ale nutno podotknout, že přístup k nim je pouze on-line, mají tam (podle mě) chyby, nejde odtud kopírovat text a ani si dělat poznámky.

V oficiálním study guidu se dočtete (a je to pravda), že nezkouší ze jmen tříd a signatury metod. Rovněž tam naleznete seznam otázek, na které byste měli znát odpověď. Test trvá 90 minut a z 50 otázek jich musíte správně zodpovědět 38 (76%). Pokud má otázka více možností, nevíte bohužel kolik.

Související