Když jsme v roce 2008 začínali s novým core systémem pro pojišťovnu, stáli jsme před klasickým dilematem: čistý Java EE (EJB 3.0, JPA, JSF) nebo Spring Framework? Zvolili jsme Spring. Čtyři roky a 200 tisíc řádků kódu později víme, že to bylo správné rozhodnutí.
Spring vs. Java EE — věčný spor¶
Java EE 6 (schválená v prosinci 2009) udělala obrovský krok vpřed. EJB 3.1 je konečně použitelné bez XML pekla, CDI přináší dependency injection přímo do specifikace a JPA 2.0 je solidní ORM standard. Na papíře už důvod pro Spring skoro neexistuje.
V praxi je to jinak. Spring má náskok v ekosystému, dokumentaci a community. Spring Security je de facto standard pro autentizaci a autorizaci v Java světě. Spring Batch nemá v Java EE ekvivalent. A hlavně — Spring vám nechává volbu application serveru. Můžete jet na Tomcatu, který je jednoduchý a lehký, místo plného Java EE serveru jako WebSphere nebo JBoss.
Dependency Injection v praxi¶
DI je srdce Springu a důvod, proč je kód s ním testovatelný. Bez DI vaše služba vytváří své závislosti sama — a vy je nemůžete v testu nahradit mockem. Se Springem deklarujete závislosti a kontejner je dodá.
@Service
public class ClaimService {
private final ClaimRepository repository;
private final NotificationService notifications;
@Autowired
public ClaimService(ClaimRepository repository,
NotificationService notifications) {
this.repository = repository;
this.notifications = notifications;
}
}
Constructor injection (místo field injection) je náš standard. Závislosti jsou explicitní, immutable a třída je použitelná i bez Spring kontejneru — stačí ji vytvořit s new a předat mocky.
Spring MVC pro web vrstvu¶
JSF (JavaServer Faces) je oficiální Java EE web framework, ale upřímně — nikdo ho nemá rád. Component-based model je těžkopádný, životní cyklus requestu je složitý a ladění je noční můra.
Spring MVC jde cestou request-based modelu (podobně jako Struts, ale čistěji). Controller je POJO s anotacemi, mapování URL je přehledné a testování je triviální — MockMvc vám umožní testovat controller bez spuštění serveru.
Pro view vrstvu používáme Thymeleaf místo JSP. Šablony jsou validní HTML, designér je může otevřít v prohlížeči bez serveru. A na rozdíl od JSP nepotřebujete servlet container pro renderování.
Transakční management¶
V enterprise systému jsou transakce všude. Spring nabízí deklarativní transakce přes anotaci @Transactional — jednoduchost EJB CMT (Container-Managed Transactions), ale bez nutnosti EJB kontejneru.
Pod kapotou Spring vytváří AOP proxy, která před metodou otevře transakci a po ní commitne (nebo rollbackne při výjimce). Důležité je rozumět propagaci — REQUIRED, REQUIRES_NEW, NESTED. Špatně nastavená propagace je častý zdroj bugů, které se projeví až pod zátěží.
Náš tip: vždy nastavte readOnly = true pro čtecí operace. Hibernate pak nemusí dělat dirty checking a výkon se znatelně zlepší. Na našem systému to znamenalo 20% snížení doby čtecích operací.
Spring Security¶
Bezpečnost v enterprise Java aplikaci je komplexní téma. Autentizace proti LDAP/Active Directory, autorizace na úrovni URL i metod, CSRF ochrana, session management, remember-me… Spring Security tohle všechno řeší.
Konfigurace bývala notoricky složitá (XML namespace s desítkami elementů), ale od verze 3.1 se výrazně zlepšila. Java config je čitelnější a IDE vám pomůže s autocompletem.
V naší pojišťovací aplikaci máme role-based access control s hierarchií rolí (AGENT → SUPERVISOR → ADMIN) a method-level security přes @PreAuthorize anotace. Každý endpoint je zabezpečený a audit log zaznamenává kdo, kdy a co dělal.
Testování — hlavní výhra¶
Největší přínos Springu není žádná konkrétní feature, ale testovatelnost. Na projektu máme přes 3000 unit testů a 400 integračních testů. Běží při každém buildu v Jenkins CI.
Unit testy jsou čisté JUnit + Mockito — žádný Spring context, žádný server, běží za sekundy. Integrační testy používají SpringJUnit4ClassRunner s in-memory H2 databází. Celý test suite doběhne za 8 minut.
Bez DI a bez Springu bychom měli zlomek tohoto pokrytí. A ten zlomek by nebyl spolehlivý, protože by závisel na externích systémech.
Co bychom udělali jinak¶
- Méně XML: Začínali jsme s XML konfigurací (2008, Spring 2.5). Dnes bychom šli rovnou na Java config a component scanning.
- Spring Profiles dříve: Profily pro dev/test/prod prostředí šetří nervy. Zavedli jsme je až po roce.
- REST od začátku: Začínali jsme s SOAP web services (WS-* stack). Dnes bychom šli rovnou na REST + JSON.
- Maven místo Ant: Build systém jsme migrovali na Maven až v roce 2010. Ztracený čas.
Shrnutí¶
Spring Framework je v roce 2012 zralá, robustní platforma pro enterprise Java vývoj. Klíčové výhody — testovatelnost, flexibilita a bohatý ekosystém — převažují nad jedinou nevýhodou (není to standard). Pro nový projekt bychom zvolili Spring znovu, bez váhání.