Přeskočit na obsah
_CORE
AI & Agentic Systems Core Informační Systémy Cloud & Platform Engineering Data Platforma & Integrace Security & Compliance QA, Testing & Observability IoT, Automatizace & Robotika Mobile & Digital Banky & Finance Pojišťovnictví Veřejná správa Obrana & Bezpečnost Zdravotnictví Energetika & Utility Telco & Média Průmysl & Výroba Logistika & E-commerce Retail & Loyalty
Reference Technologie Blog Knowledge Base O nás Spolupráce Kariéra
Pojďme to probrat

Spring Framework pro Java enterprise

14. 05. 2012 4 min čtení CORE SYSTEMSdevelopment

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í.

javaspringenterprisebackend