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í.
Brauchen Sie Hilfe bei der Implementierung?
Unsere Experten helfen Ihnen bei Design, Implementierung und Betrieb. Von der Architektur bis zur Produktion.
Kontaktieren Sie uns