Illustrated technology atlas · Java fundamentals and Spring Framework / major Spring portfolio projects

Java & Spring — Illustrated Engineering Atlas

Best practices

Depth 2: fundamentals and best practices for a working software engineer. 32 topics cover Java contracts and runtime, Framework core, Boot, web/data/security, messaging/integration/batch, Cloud, testing/observability and optional Modulith/AI/native/specialist capabilities. This is a broad mechanism atlas, not exhaustive documentation of every Spring API or cloud subproject. Java examples use non-preview constructs from modern Java (records require 16+; virtual threads 21+). Research anchors Java SE 25 and live Spring documentation retrieved 2026-10-09. The retrieved Boot system-requirements page reports Boot 4.1.1, Framework 7.0.9+, Java 17–26. Use the matching BOM and supported project generations; do not combine displayed individual project versions arbitrarily. Code snippets are illustrative and were not compiled as a complete application. Choices and improvements marked synthesis are reasoned recommendations, not measured performance results.

Research date: 2026-10-09

Five learning bands: Java, Spring core, applications, production judgment and further improvements.
Part 1 · Fundamentals

Java, Framework, Boot: find the layers

Prerequisites: Start here / basic technical literacy

Which layer owns the behavior?

Java / JVM: language + runtime; Spring Framework: container + infrastructure; Spring Boot: assembly + configuration; Portfolio projects: Data / Security / Cloud. Connections: Spring Boot to Spring Framework (builds on); Spring Framework to Java / JVM (runs on); Portfolio projects to Spring Boot (integrates)
Layer arrows mean builds on or integrates with; they are not the path of an HTTP request. [S01] [S02] [S43]

Goal & mental model verified

Learn which layer owns which concern. Java supplies the language and runtime. Framework supplies the container and application infrastructure. Boot assembles and configures applications. Portfolio projects add specialized capabilities.

[S01] [S02]

Worked example · design exercise synthesis

For a quote API, start with Java, Boot, MVC, Data and Security. Add Batch for overnight reconciliation; add messaging when asynchronous delivery is required. A portfolio is a toolbox, not a dependency shopping list.

[S01] [S02] [S43]

Engineering decision synthesis

Choose a compatible Boot generation first; let its dependency management align libraries. This reduces manual coordination but means an upgrade can change several components together.

[S01] [S02] [S43]

Pitfall & diagnosis synthesis

“All Spring” is too broad for exhaustive API coverage. This atlas teaches major mechanisms and maps specialist projects; it does not document every method or cloud provider integration.

[S01] [S02] [S43]

Improve & validate synthesis

Compare your actual dependency tree with the compatible project generations. Remove unused starters and track a reproducible runtime/build baseline.

[S01] [S02] [S43]
Keep this: Know the owner of a behavior before debugging its annotations.
Check yourself: Does Boot replace Framework?

No. Boot builds on Framework and automates application setup.

Part 2 · Fundamentals

Types, objects, records and domain invariants

Prerequisites: 01-ecosystem

Why can a final reference still change?

Reference A: points to a list; Reference B: points to same list; Mutable list: shared object. Connections: Reference A to Mutable list (alias); Reference B to Mutable list (alias)
Reference identity and object state are different; defensive copies break unwanted sharing. [S03] [S04] [S05]

Goal & mental model verified

Separate primitive values from object references. An interface states a contract; a class implements behavior. Records express data aggregates with final component fields; they do not make referenced collections deeply immutable.

[S03] [S04]

Worked example · illustrative, not executed synthesis

record QuoteId(String value) {}
record Quote(QuoteId id, java.util.List<String> covers) {
  Quote { covers = java.util.List.copyOf(covers); }
}
// The defensive copy prevents external list mutation.
[S03] [S04] [S05]

Engineering decision synthesis

Use composition for replaceable pricing behavior and small value types for identifiers. This clarifies invariants at the cost of more explicit conversions.

[S03] [S04] [S05]

Pitfall & diagnosis synthesis

A final reference can point to a mutable object. Value equality also needs a compatible hashCode; identity equality with == answers a different question.

[S03] [S04] [S05]

Improve & validate synthesis

Move invalid-state checks into construction boundaries. Test equality, null handling and defensive copies where the business invariant depends on them.

[S03] [S04] [S05]
Keep this: A type should make the wrong state harder to represent.
Check yourself: Is a record containing ArrayList deeply immutable?

No. Its field reference is final, but the referenced list can remain mutable.

Part 3 · Fundamentals

Collections, generics and equality

Prerequisites: 01-ecosystem

Which collection matches the invariant?

Requirement: What must stay true?; List: sequence + duplicates; Set: unique membership; Map: key → value. Connections: Requirement to List (ordered sequence); Requirement to Set (uniqueness); Requirement to Map (lookup by key)
These are contracts, not performance rankings. Implementation and workload determine cost. [S06] [S07] [S05]

Goal & mental model verified

Select the collection by its contract: List preserves a sequence, Set models uniqueness, Map associates keys and values. Hash-based containers rely on equality and hashing; HashMap does not promise iteration order.

[S06] [S07]

Worked example · design exercise synthesis

A broker list preserves display order; a Set tracks unique coverage codes; a Map indexes quotes by stable QuoteId. Use a sorted map when sorted traversal is part of the requirement.

[S06] [S07] [S05]

Engineering decision synthesis

Prefer interface-typed variables and explicit generic parameters. Choose ArrayList for ordinary indexed sequences; choose a deque for queue/stack operations instead of treating one structure as universal.

[S06] [S07] [S05]

Pitfall & diagnosis synthesis

Changing fields used by a key’s equality/hash after insertion can make lookup fail. Concurrent access needs a suitable concurrency strategy, not merely a different collection name.

[S06] [S07] [S05]

Improve & validate synthesis

Write down ordering, duplicate and mutation requirements before selection. Measure realistic access patterns before swapping structures for supposed performance gains.

[S06] [S07] [S05]
Keep this: Collection contracts are part of your domain contract.
Check yourself: Why are mutable map keys dangerous?

Their hash/equality behavior may change after storage, so later lookup searches the wrong location.

Part 4 · Fundamentals

Lambdas, streams and honest parallelism

Prerequisites: 01-ecosystem

When does a stream actually execute?

Source: quotes; filter → map: lazy transformations; toList(): terminal traversal; Result list: materialized values. Connections: Source to filter → map (elements); filter → map to toList() (evaluated on demand); toList() to Result list (collect)
This is a sequential pipeline. Parallel execution requires separate assumptions about side effects and workload. [S08] [S11]

Goal & mental model verified

A lambda implements a functional interface. A Stream describes a computation over a source: intermediate transformations are lazy, and a terminal operation consumes the pipeline. A stream is not a reusable collection.

[S08] [S11]

Worked example · illustrative, not executed synthesis

var ids = quotes.stream()
    .filter(q -> q.premium().signum() > 0)
    .map(Quote::id)
    .toList();
// Schematic: Quote exposes premium() and id().
[S08] [S11]

Engineering decision synthesis

Use streams for clear transformations and loops for stateful control flow or early branching. Parallel execution adds coordination overhead and is useful only with appropriate work and isolation.

[S08] [S11]

Pitfall & diagnosis synthesis

Side effects inside map/filter make ordering and parallel behavior difficult to reason about. A parallel stream is not a safe way to issue unbounded database calls.

[S08] [S11]

Improve & validate synthesis

Start sequential. Benchmark representative inputs and examine thread usage before adopting parallelism; isolate blocking I/O with an explicit bounded execution policy.

[S08] [S11]
Keep this: Readable transformation beats decorative functional syntax.
Check yourself: Why does filter alone produce no result?

It is intermediate and lazy; a terminal operation such as toList triggers traversal.

Part 5 · Fundamentals

Resource ownership and decimal money

Prerequisites: 01-ecosystem

What must be explicit at a boundary?

Owner scope: opens resource; Use resource: success or exception; close(): scope exits; Money policy: currency + rounding. Connections: Owner scope to Use resource (try-with-resources); Use resource to close() (always on exit)
Top: deterministic resource lifetime. Bottom: decimal policy is a separate domain decision. [S09] [S10]

Goal & mental model verified

Garbage collection does not replace deterministic resource closure. AutoCloseable integrates with try-with-resources. BigDecimal models decimal arithmetic, with explicit precision/rounding decisions and scale-sensitive equals.

[S09] [S10]

Worked example · illustrative, not executed synthesis

var premium = new java.math.BigDecimal("1250000.00");
var tax = premium.multiply(new java.math.BigDecimal("0.10"));
// Pair amounts with a currency and an explicit rounding policy.
try (var reader = java.nio.file.Files.newBufferedReader(path)) {
  return reader.readLine();
}
[S09] [S10]

Engineering decision synthesis

Use decimal values or an explicitly specified minor-unit model for premiums. State currency, scale and rounding at business boundaries; neither approach chooses the policy for you.

[S09] [S10]

Pitfall & diagnosis synthesis

BigDecimal constructed from a binary double can inherit representation artifacts. Leaking file/database resources can exhaust capacity even when heap usage appears healthy.

[S09] [S10]

Improve & validate synthesis

Define resource ownership and close scope. Exercise rounding edges and failure paths; compare 1.0 and 1.00 with the intended numeric or representation semantics.

[S09] [S10]
Keep this: Memory, resources and money each need their own ownership rules.
Check yourself: Does BigDecimal.equals ignore scale?

No. compareTo can test numeric equality; equals also distinguishes scale.

Part 6 · Fundamentals

Concurrency, visibility and virtual threads

Prerequisites: 01-ecosystem

Where should concurrency be limited?

Many tasks: virtual threads; Semaphore: bounded admission; DB / insurer: scarce capacity; Waiting tasks: do not consume slots. Connections: Many tasks to Semaphore (request slot); Semaphore to DB / insurer (admitted work); Semaphore to Waiting tasks (no slot available)
Limit the scarce downstream resource. The figure illustrates admission control, not virtual-thread scheduling internals. [S11] [S12] [S13]

Goal & mental model verified

Concurrency coordinates overlapping tasks. Visibility and atomicity are different: volatile can publish writes, but does not make read-modify-write increments atomic. Virtual threads make blocking I/O concurrency cheaper; they do not create CPU or database capacity.

[S11] [S12]

Worked example · design exercise synthesis

Two workers read count=0 and both write 1: one increment is lost. AtomicInteger or a lock can protect this invariant. For quote calls, a semaphore can bound access to a scarce insurer connection.

[S11] [S12] [S13]

Engineering decision synthesis

Use virtual threads for many blocking I/O tasks when dependencies fit. Bound downstream concurrency; use workload-appropriate executors for CPU work and decide timeout/cancellation ownership.

[S11] [S12] [S13]

Pitfall & diagnosis synthesis

A shared mutable singleton remains shared under virtual threads. Avoid pooling virtual threads. Pinning guidance is JDK-dependent; older synchronized pinning advice should not be repeated universally for newer JDKs.

[S11] [S12] [S13]

Improve & validate synthesis

Load-test with slow dependencies. Record pool wait, in-flight calls, CPU and tail latency; stop increasing concurrency when the constrained resource saturates.

[S11] [S12] [S13]
Keep this: Cheap waiting is not unlimited throughput.
Check yourself: Does volatile count++ become atomic?

No. Reading, adding and writing remain a compound operation.

Part 7 · Fundamentals

JVM, JIT, garbage collection and diagnosis

Prerequisites: 01-ecosystem

How do execution and evidence connect?

Bytecode: loaded methods; Interpreter: execute + profile; JIT compilation: hot methods; Heap / GC: allocation + reclamation; JFR recording: runtime evidence. Connections: Bytecode to Interpreter (execute); Interpreter to JIT compilation (hot code); Interpreter to JFR recording (events); Heap / GC to JFR recording (events)
Simplified HotSpot view. JFR includes additional event categories; GC and compilation may run concurrently. [S14] [S15]

Goal & mental model verified

HotSpot starts with interpretation and adaptively compiles hot code. Garbage collection manages object memory. Flight Recorder captures runtime events for diagnosis; request latency can include CPU, allocation, locks and external waiting.

[S14] [S15]

Worked example · design exercise synthesis

A quote endpoint’s latency rises while CPU stays modest. A recording and dependency timings may reveal contention or connection waits rather than expensive Java computation.

[S14] [S15]

Engineering decision synthesis

Choose a runtime and collector against workload and deployment limits. Compare warm steady-state behavior and startup separately; a microbenchmark rarely predicts full service latency.

[S14] [S15]

Pitfall & diagnosis synthesis

Treating every pause as a GC problem can hide a slow database. Increasing heap can reduce some collection pressure while increasing footprint and changing pause behavior.

[S14] [S15]

Improve & validate synthesis

Form a hypothesis, capture JFR plus service metrics, change one factor, then repeat representative load. Keep the measurement environment and warm-up conditions explicit.

[S14] [S15]
Keep this: Observe the bottleneck before tuning the JVM.
Check yourself: Can low CPU coexist with high latency?

Yes. A request may be waiting for a lock, I/O or a scarce connection.

Part 8 · Fundamentals

IoC, constructor injection and bean definitions

Prerequisites: 01-ecosystem

Who creates and connects collaborators?

ApplicationContext: bean definitions; Pricing adapter: implements PricingPort; QuoteService: requires PricingPort. Connections: ApplicationContext to Pricing adapter (construct); ApplicationContext to QuoteService (construct); Pricing adapter to QuoteService (inject reference)
Arrows distinguish construction from injecting an existing collaborator. Business calls are omitted. [S16] [S20]

Goal & mental model verified

Inversion of control means the container constructs and connects collaborators. Dependency injection exposes what an object needs. Component scanning and @Bean methods are two ways to register bean definitions.

[S16] [S20]

Worked example · illustrative, not executed synthesis

class QuoteService {
  private final PricingPort pricing;
  QuoteService(PricingPort pricing) { this.pricing = pricing; }
}
// Register QuoteService and a PricingPort implementation as beans.
[S16] [S20]

Engineering decision synthesis

Use constructor injection for required collaborators. Use @Bean for third-party objects or explicit assembly; use qualifiers when multiple candidates represent meaningful alternatives.

[S16] [S20]

Pitfall & diagnosis synthesis

Field injection hides required dependencies and complicates plain construction. Circular dependencies often signal tangled responsibilities; adding lazy references can conceal the design problem.

[S16] [S20]

Improve & validate synthesis

Construct business services directly in unit tests. Inspect candidate ambiguity and configuration boundaries before widening component scans.

[S16] [S20]
Keep this: The container should assemble your design, not become your design.
Check yourself: Why inject an interface?

It names a replaceable contract; the container supplies the selected implementation.

Part 9 · Fundamentals

Scopes, lifecycle and thread-safe singleton design

Prerequisites: 01-ecosystem

When is a bean ready for advised calls?

Create bean: inject dependencies; Initialize target: lifecycle callbacks; Expose bean: possibly proxied; Destroy managed bean: shutdown callbacks. Connections: Create bean to Initialize target (populate); Initialize target to Expose bean (post-process); Expose bean to Destroy managed bean (container closes)
Typical simplified lifecycle. Prototype destruction and manually created objects require separate ownership. [S17] [S18]

Goal & mental model verified

A singleton is one instance per bean definition per container. Request scope follows a web request. The container manages initialization/destruction for managed beans, with important exceptions such as prototype destruction.

[S17] [S18]

Worked example · design exercise synthesis

QuoteService may safely be a singleton when it stores only stable collaborators. A mutable currentTenant field would mix simultaneous requests; carry tenant context through an explicit request-level mechanism instead.

[S17] [S18]

Engineering decision synthesis

Keep shared service state immutable or deliberately synchronized. Choose scope by ownership and lifetime; request-scoped dependencies in singletons need appropriate proxies or lookup.

[S17] [S18]

Pitfall & diagnosis synthesis

@PostConstruct runs during initialization, before normal proxy-mediated use. Depending on transactional advice there is unsafe. Prototype cleanup is not automatically managed like singleton destruction.

[S17] [S18]

Improve & validate synthesis

Move external startup work into a suitable lifecycle stage. Test concurrent requests and shutdown; name who owns cleanup for prototype or manually created objects.

[S17] [S18]
Keep this: Scope controls lifetime; it does not grant thread safety.
Check yourself: Does singleton mean one instance across a cluster?

No. Each application container has its own singleton instances.

Part 10 · Fundamentals

AOP proxies: why annotations sometimes vanish

Prerequisites: 01-ecosystem

Which call crosses the proxy boundary?

Caller: managed reference; Proxy: transaction / other advice; Target issue(): business operation; Target audit(): self-invocation. Connections: Caller to Proxy (external call); Proxy to Target issue() (intercepted); Target issue() to Target audit() (this.audit() bypasses proxy)
Default Spring AOP proxy mode. A self-call does not return to the proxy; weaving can behave differently. [S19] [S30]

How can an advised audit boundary become explicit?

QuoteService: issues policy; AuditService proxy: independent advice; Audit target: audit operation. Connections: QuoteService to AuditService proxy (injected collaborator); AuditService proxy to Audit target (proxy interception)
Proposed refactoring: call another managed collaborator. Select transaction propagation intentionally; separate beans alone do not select it. [S19] [S30]

Goal & mental model verified

Spring AOP commonly intercepts calls through a proxy before reaching the target. JDK interface proxies and subclass proxies have different constraints. A target calling itself does not re-enter its Spring AOP proxy.

[S19] [S30]

Worked example · design exercise synthesis

A controller invokes quoteService.issue(): transaction advice runs. Inside the target, this.audit() bypasses proxy interception, even if audit has an advice-triggering annotation.

[S19] [S30]

Engineering decision synthesis

Place independently advised operations on separate collaborators or use an explicit programmatic boundary. This adds a visible interface but avoids magical assumptions about annotation placement.

[S19] [S30]

Pitfall & diagnosis synthesis

Subclass proxies cannot advise final/private methods as overridable methods. Calling a manually constructed object also bypasses container advice. AspectJ weaving is a different mechanism.

[S19] [S30]

Improve & validate synthesis

Test behavior through the managed bean and deliberately exercise self-invocation. Inspect actual proxy type and advice ordering when multiple concerns wrap one method.

[S19] [S30]
Keep this: An annotation is metadata; the invocation path makes it operational.
Check yourself: Will this.audit() start a proxy-driven new transaction?

Not in default proxy mode. The call stays within the target.

Part 11 · Fundamentals

Spring Boot: conditional assembly, not sorcery

Prerequisites: 01-ecosystem

Why was an infrastructure bean created?

Classpath: libraries present?; Properties: feature enabled?; Existing beans: user replacement?; Conditions evaluated: create or back off. Connections: Classpath to Conditions evaluated (class conditions); Properties to Conditions evaluated (property conditions); Existing beans to Conditions evaluated (bean conditions)
Conditions vary by auto-configuration. This figure shows the main inputs, not every condition type. [S21] [S02] [S20]

Goal & mental model verified

Boot auto-configuration uses available classes, properties and existing beans to configure infrastructure. User definitions can cause defaults to back off. Starters assemble related dependencies; dependency management aligns versions.

[S21] [S02]

Worked example · design exercise synthesis

Add a database driver and the relevant starter, supply connection properties, and Boot can create infrastructure beans. Define your own DataSource and the matching default may no longer apply.

[S21] [S02] [S20]

Engineering decision synthesis

Keep Boot-managed versions aligned unless an override has a documented reason. Select a supported runtime and build tool for your chosen generation.

[S21] [S02] [S20]

Pitfall & diagnosis synthesis

A starter can activate unexpected configuration. Mixing individual Spring versions may produce linkage errors. A bean declared too broadly can accidentally replace a useful default.

[S21] [S02] [S20]

Improve & validate synthesis

Use the condition evaluation report to understand why configuration matched or failed. Record custom overrides and test upgrades against startup and representative paths.

[S21] [S02] [S20]
Keep this: Auto-configuration is conditional code you can inspect.
Check yourself: Does adding a starter guarantee a working database?

No. Driver, credentials, reachable infrastructure and matching configuration still matter.

Part 12 · Applications

Configuration, profiles and secret boundaries

Prerequisites: 01-ecosystem

Which configuration value actually wins?

application.yml: baseline; Environment: deployment overrides; CLI / other sources: ordered inputs; Effective value: bind + validate. Connections: application.yml to Effective value (property sources); Environment to Effective value (property sources); CLI / other sources to Effective value (property sources)
The complete precedence order is documented in Boot. This diagram illustrates merging, not the whole ranked list. [S22]

Goal & mental model verified

Boot combines ordered property sources into an Environment and binds structured configuration. Later/higher-precedence sources can override earlier values. Profiles select configurations; they are not a security boundary.

[S22]

Worked example · design exercise synthesis

For pricing.timeout, define a default and an environment-specific override. Bind settings into a typed ConfigurationProperties object and validate required values instead of scattering string lookups.

[S22]

Engineering decision synthesis

Treat operational settings as external inputs and make startup fail clearly on invalid required configuration. This improves repeatability but demands disciplined deployment configuration.

[S22]

Pitfall & diagnosis synthesis

An unexpected environment variable can override a checked-in value. Logging a full configuration dump can reveal secrets; a prod profile does not protect management endpoints.

[S22]

Improve & validate synthesis

Document the effective source and precedence for critical settings. Review secrets access separately and test startup with missing, malformed and overridden values.

[S22]
Keep this: Debug the effective configuration, not just the file you edited.
Check yourself: Why might changing application.yml have no effect?

A higher-precedence source can supply the same property.

Part 13 · Applications

MVC request flow, DTO validation and errors

Prerequisites: 01-ecosystem

Where do request responsibilities belong?

DispatcherServlet: route request; Controller + DTO: validate / translate; Service: business rules; Repository: persistence; Exception handling: ProblemDetail. Connections: DispatcherServlet to Controller + DTO (invoke handler); Controller + DTO to Service (use case); Service to Repository (data access); Controller + DTO to Exception handling (invalid input); Service to Exception handling (failure)
Request-side responsibilities; responses return through MVC. Authentication filters normally run before this view. [S23] [S24] [S25]

Goal & mental model verified

DispatcherServlet delegates request mapping and invocation to MVC components. Validation checks request constraints. Error handling can produce ProblemDetail responses rather than leaking internal exception representations.

[S23] [S24]

Worked example · design exercise synthesis

POST /quotes accepts a validated request DTO. The service enforces business eligibility; the repository persists. A validation failure returns a stable client error, while an internal failure gets a traceable sanitized response.

[S23] [S24] [S25]

Engineering decision synthesis

Keep controllers focused on transport and services on use-case policy. DTOs decouple API shapes from persistence; the additional mapping is an intentional boundary cost.

[S23] [S24] [S25]

Pitfall & diagnosis synthesis

Bean Validation cannot prove business eligibility or authorization. Returning persistence entities can expose fields and trigger unexpected serialization-time loads.

[S23] [S24] [S25]

Improve & validate synthesis

Exercise malformed input, missing access and failure responses with HTTP tests. Keep stable problem types and correlate internal diagnostics without returning stack traces.

[S23] [S24] [S25]
Keep this: Validate syntax at transport boundaries and invariants in the domain.
Check yourself: Can @Valid prove an agent owns a policy?

No. Ownership is an authorization/domain rule, not just a field constraint.

Part 14 · Applications

MVC, WebFlux and virtual threads: choose by constraints

Prerequisites: 01-ecosystem

Which I/O contract fits the execution model?

MVC: request execution; Blocking driver: JDBC / JPA; Virtual threads: cheap blocking waits; WebFlux: event-loop processing; Non-blocking driver: async I/O + demand. Connections: MVC to Blocking driver (imperative I/O); Virtual threads to Blocking driver (still bounded); WebFlux to Non-blocking driver (reactive pipeline)
Two valid styles; virtual-thread configuration is separate from choosing MVC. No universal performance ranking is implied. [S26] [S13] [S44]

Goal & mental model verified

MVC supports an imperative request model; WebFlux uses non-blocking composition and reactive backpressure. Mono represents zero-or-one values and Flux a sequence. Virtual threads provide a separate way to scale blocking waits.

[S26] [S13]

Worked example · design exercise synthesis

A JPA quote API fits MVC naturally. A streaming aggregator with non-blocking downstream clients may fit WebFlux. Wrapping a blocking JPA call in Mono does not make its I/O non-blocking.

[S26] [S13] [S44]

Engineering decision synthesis

Choose based on dependency APIs, concurrency pattern and team expertise. MVC with virtual threads can retain readable blocking code; WebFlux adds composition and scheduling discipline.

[S26] [S13] [S44]

Pitfall & diagnosis synthesis

Blocking an event loop can stall unrelated requests. A reactive return type alone does not identify the server stack, and virtual threads do not remove database limits.

[S26] [S13] [S44]

Improve & validate synthesis

Prototype the same realistic workload with bounded dependencies. Compare memory, tail latency and failure handling; adopt complexity only for a measured benefit.

[S26] [S13] [S44]
Keep this: Choose an execution model for your dependencies, not your fashion sense.
Check yourself: Does Mono.just(blockingCall()) defer that call?

No. The argument is evaluated immediately before Mono.just receives it.

Part 15 · Applications

Spring Data: repositories, aggregates and fetch plans

Prerequisites: 01-ecosystem

Where does repository abstraction stop?

Repository contract: query + aggregate intent; JPA model: context + relationships; JDBC model: explicit aggregates; Actual database: SQL + indexes + rows. Connections: Repository contract to JPA model (implementation); Repository contract to JDBC model (implementation); JPA model to Actual database (queries); JDBC model to Actual database (queries)
JPA and JDBC are alternatives shown together for comparison. They do not share a persistence context. [S27] [S28] [S29]

Goal & mental model verified

Spring Data builds repository abstractions around store-specific behavior. JPA has persistence-context and relationship semantics; Data JDBC uses a simpler aggregate model. Derived queries reduce boilerplate without replacing query design.

[S27] [S28]

Worked example · design exercise synthesis

A broker dashboard pages quotes by tenant and status. Use a response projection and a deliberate fetch plan instead of traversing every policy relationship during JSON serialization.

[S27] [S28] [S29]

Engineering decision synthesis

Choose JPA when its entity model helps; choose JDBC-style access when explicit aggregate operations fit. R2DBC is a non-blocking access model, not reactive JPA.

[S27] [S28] [S29]

Pitfall & diagnosis synthesis

A compact repository method can still produce expensive SQL. N+1 access and loading oversized graphs should be diagnosed through executed queries and row counts, not annotation counts.

[S27] [S28] [S29]

Improve & validate synthesis

Capture SQL and query plans for representative tenant sizes. Validate pagination and fetch plans together; compare query count and end-to-end latency after changes.

[S27] [S28] [S29]
Keep this: Repository convenience does not cancel database physics.
Check yourself: Is R2DBC just JPA returning Mono?

No. It is a different non-blocking relational access model.

Part 16 · Applications

Transactions, rollback and propagation boundaries

Prerequisites: 01-ecosystem

What does the transaction actually protect?

Transaction proxy: begin / participate; Database updates: quote + policy; Commit or rollback: configured rules; External email: outside DB atomicity. Connections: Transaction proxy to Database updates (invoke service); Database updates to Commit or rollback (method outcome); Database updates to External email (side effect risk)
One database transaction. Reactive transaction context, distributed coordination and propagation need separate treatment. [S30] [S31] [S19]

Goal & mental model verified

@Transactional defines an advised transaction boundary. Default rollback typically covers unchecked exceptions and Error; checked-exception behavior can be customized, including global defaults. Read-only is generally a hint, not a universal write prohibition.

[S30] [S31]

Worked example · design exercise synthesis

An issuePolicy service method updates the quote and inserts the policy in one database transaction. An email call is not rolled back just because the database transaction fails.

[S30] [S31] [S19]

Engineering decision synthesis

Keep boundaries around coherent database use cases and avoid long remote waits while holding connections. Choose explicit rollback policy and account for propagation and pool capacity.

[S30] [S31] [S19]

Pitfall & diagnosis synthesis

Self-invocation can bypass advice. Catching and swallowing a failure can prevent expected rollback. REQUIRES_NEW can require an additional connection and therefore worsen pool pressure.

[S30] [S31] [S19]

Improve & validate synthesis

Verify rollback through the proxied bean with real persistence. Exercise checked exceptions, concurrent conflicts and external side-effect failure separately.

[S30] [S31] [S19]
Keep this: A local transaction is a precise boundary, not a universal undo button.
Check yourself: Will a database rollback unsend an email?

No. External effects need separate coordination such as durable events and idempotent handling.

Part 17 · Applications

Security filters, JWT and domain authorization

Prerequisites: 01-ecosystem

Where does identity become resource access?

HTTP request: bearer token; SecurityFilterChain: verify + authenticate; Authorities: mapped claims; Resource decision: permission + tenant. Connections: HTTP request to SecurityFilterChain (matched chain); SecurityFilterChain to Authorities (authenticated identity); Authorities to Resource decision (authorize use case)
Servlet resource-server example. Token verification and per-resource authorization are separate decisions. [S32] [S33]

Goal & mental model verified

SecurityFilterChain applies authentication and authorization to matching servlet requests. A resource server verifies bearer tokens and derives authorities; accepting a decoded token is not equivalent to verifying it.

[S32] [S33]

Worked example · design exercise synthesis

With Keycloak as issuer, validate the JWT signature, issuer and applicable claims. Convert claims deliberately, then check that the authenticated agent may access the requested tenant’s policy.

[S32] [S33]

Engineering decision synthesis

Keep identity-provider responsibilities separate from application resource rules. Token authorities can express permissions, but row/tenant ownership still belongs in enforceable application logic.

[S32] [S33]

Pitfall & diagnosis synthesis

A valid token can target another tenant’s resource. Incorrect matcher order can leave a route under the wrong filter chain. Configure audience requirements rather than assuming they are always enforced automatically.

[S32] [S33]

Improve & validate synthesis

Test anonymous, expired, wrong-issuer, wrong-audience and cross-tenant requests. Inspect granted authorities and deny access consistently at the relevant resource boundary.

[S32] [S33]
Keep this: Authentication names the caller; authorization constrains the action.
Check yourself: Does a valid JWT authorize every policy ID?

No. The application must enforce permission and ownership for that resource.

Part 18 · Applications

Sessions, browser credentials and CSRF

Prerequisites: 01-ecosystem

How do sessions survive replica changes?

Browser: cookie + CSRF token; App replica A: session integration; App replica B: session integration; Shared session store: expiry + state. Connections: Browser to App replica A (request); Browser to App replica B (next request); App replica A to Shared session store (load / save); App replica B to Shared session store (load / save)
A shared session store is an option, not mandatory for every app. CSRF still depends on credential transport. [S34] [S35]

Goal & mental model verified

Spring Session externalizes session handling through shared implementations. CSRF is about a browser automatically attaching credentials to a forged request; it is not solved by calling the API “REST.”

[S34] [S35]

Worked example · design exercise synthesis

A browser broker portal uses a session cookie and CSRF token on state-changing requests. Two app replicas can access shared session state instead of relying solely on one process’s memory.

[S34] [S35]

Engineering decision synthesis

Choose session or bearer-token flows from client and threat requirements. Shared sessions improve replica mobility but introduce storage availability, expiration and serialization concerns.

[S34] [S35]

Pitfall & diagnosis synthesis

Stateless does not automatically mean CSRF-safe if browser credentials are still sent automatically. CORS policy is not a replacement for CSRF protection.

[S34] [S35]

Improve & validate synthesis

Exercise expiration, logout, replica changes and state-changing cross-origin requests. Confirm credential behavior and token checks for the actual browser flow.

[S34] [S35]
Keep this: Understand how credentials travel before disabling protections.
Check yourself: Why can a cookie API need CSRF protection?

Because a browser can automatically attach the cookie to a forged request.

Part 19 · Applications

Caching: keys, freshness and invalidation

Prerequisites: 01-ecosystem

What happens on a cache hit and miss?

Read request: tenant + policy ID; Cache lookup: complete key; Return cached value: hit; Database load: miss; Populate cache: provider policy. Connections: Read request to Cache lookup (lookup); Cache lookup to Return cached value (hit); Cache lookup to Database load (miss); Database load to Populate cache (loaded result)
Cache-aside conceptual flow. TTL, stampede control and update consistency are provider/application choices. [S36] [S37]

Goal & mental model verified

Spring’s cache abstraction delegates storage to a backing implementation. @Cacheable can reuse results; eviction and updates define freshness behavior. An annotation alone does not define TTL or make a distributed cache consistent.

[S36] [S37]

Worked example · design exercise synthesis

For a policy summary, use a key containing tenant and policy ID. Evict or update affected summaries after successful policy changes under an explicitly chosen consistency policy.

[S36] [S37]

Engineering decision synthesis

Cache expensive, repeatedly read data with an acceptable staleness budget. Choose local versus shared storage by consistency, footprint and latency requirements.

[S36] [S37]

Pitfall & diagnosis synthesis

Missing tenant identity in a key can reuse another tenant’s data. Default proxy-based caching also has self-invocation limits. Cache invalidation and database commit ordering need care.

[S36] [S37]

Improve & validate synthesis

Measure hit ratio, stale reads and miss cost. Exercise concurrent misses and updates; bound entry size and TTL using the provider’s configuration.

[S36] [S37]
Keep this: Every cache needs an owner, a key contract and a freshness promise.
Check yourself: Does @Cacheable itself choose a TTL?

No. Expiration is generally a backing-cache/provider concern.

Part 20 · Applications

Kafka, AMQP and Pulsar: delivery boundaries

Prerequisites: 01-ecosystem

Where can a duplicate become a second effect?

Broker event: event ID = E42; Consumer: process + deduplicate; Business store: effect + event marker; Acknowledge / commit: after chosen boundary. Connections: Broker event to Consumer (delivery / redelivery); Consumer to Business store (durable effect); Consumer to Acknowledge / commit (processing outcome)
Application-level idempotency sketch; broker protocols and acknowledgement semantics differ. [S38] [S39] [S59]

Goal & mental model verified

Spring messaging integrations connect templates and listeners to broker-specific behavior. Kafka transactions can cover a read/process/write Kafka sequence; this does not universally make external database or HTTP side effects exactly once.

[S38] [S39]

Worked example · design exercise synthesis

A PolicyIssued event may be redelivered. A consumer records a stable event ID and performs its database change atomically where feasible, avoiding a second business effect on retry.

[S38] [S39] [S59]

Engineering decision synthesis

Use messaging to decouple timing and absorb work under explicit delivery rules. Choose the broker by ordering, routing, retention and operational requirements rather than a universal winner.

[S38] [S39] [S59]

Pitfall & diagnosis synthesis

Acknowledging before durable processing can lose work; acknowledging afterward can allow redelivery. “Exactly once” must name the protected boundary, and poison-message retries need a finite outcome.

[S38] [S39] [S59]

Improve & validate synthesis

Test a crash after the effect but before acknowledgement. Track lag, retries and dead-letter handling; verify deduplication with the actual transaction and broker configuration.

[S38] [S39] [S59]
Keep this: Assume retries can repeat business work unless your boundary proves otherwise.
Check yourself: Does Kafka EOS make an HTTP payment exactly once?

No. The external payment needs its own idempotency and coordination contract.

Part 21 · Applications

Spring Integration: adapters, channels and routing

Prerequisites: 01-ecosystem

How does one input become two processing paths?

Inbound adapter: file / external source; Transformer: normalize message; Router: evaluate record; Underwriting channel: accepted records; Review channel: malformed records. Connections: Inbound adapter to Transformer (message channel); Transformer to Router (normalized message); Router to Underwriting channel (valid); Router to Review channel (invalid)
Enterprise integration pattern example; channels can be synchronous or asynchronous. [S40] [S53]

Goal & mental model verified

Spring Integration models messages passing through channels and endpoints. Adapters connect external systems; transformers change representation; routers select destinations. Channel type affects threading and delivery behavior.

[S40] [S53]

Worked example · design exercise synthesis

An inbound insurer file adapter emits messages. A transformer normalizes records; a router sends valid records to underwriting and malformed ones to a review destination.

[S40] [S53]

Engineering decision synthesis

Use integration flows when multiple protocols and routing rules need explicit composition. Prefer a direct service call for a simple local interaction; each extra channel adds behavior to understand.

[S40] [S53]

Pitfall & diagnosis synthesis

Assuming every channel is asynchronous misreads the execution model. A slow endpoint can block a synchronous flow; unbounded asynchronous handoff can merely move overload into memory.

[S40] [S53]

Improve & validate synthesis

Choose and document channel capacity and error handling. Simulate slow consumers and malformed messages; inspect queue depth, rejection behavior and recovery ownership.

[S40] [S53]
Keep this: A diagrammed integration flow still needs a capacity model.
Check yourself: Is every Spring Integration channel async?

No. Channel implementation determines handoff and threading behavior.

Part 22 · Applications

Spring Batch: chunk commits and safe restarts

Prerequisites: 01-ecosystem

What survives a batch failure?

ItemReader: read records; ItemProcessor: transform / filter; ItemWriter: write chunk; Chunk commit: durable boundary; JobRepository: execution metadata. Connections: ItemReader to ItemProcessor (items); ItemProcessor to ItemWriter (chunk items); ItemWriter to Chunk commit (commit interval); Chunk commit to JobRepository (record progress)
Conceptual chunk and metadata responsibilities; transaction participation depends on actual repository/resource configuration. [S41] [S42]

Which work remains after a failed chunk?

Chunks 1–7: committed work; Chunk 8: failed / rolled back; Restart: resume per contract; Execution metadata: saved progress. Connections: Chunks 1–7 to Chunk 8 (later processing); Chunk 8 to Restart (new execution); Execution metadata to Restart (restart state)
Conceptual restart boundary. Stable input, restartable components and durable metadata are required; external effects need idempotency. [S41] [S42]

Goal & mental model verified

A Job contains Steps; chunk-oriented processing reads items, optionally processes them, and writes a chunk at a commit interval. Job/Step execution metadata distinguishes logical instances, attempts and restart state.

[S41] [S42]

Worked example · design exercise synthesis

An overnight reconciliation job handles rows in chunks. If a later chunk fails, previously committed chunks remain; restart behavior depends on metadata and the components’ restart contracts.

[S41] [S42]

Engineering decision synthesis

Choose chunk size against transaction duration, memory and write cost. Use stable job parameters and restartable input ordering; external side effects still need deliberate idempotency.

[S41] [S42]

Pitfall & diagnosis synthesis

A restarted job is not equivalent to replaying every row from zero. Changing input between attempts or losing execution metadata can break assumptions and duplicate effects.

[S41] [S42]

Improve & validate synthesis

Fail a run deliberately halfway through. Verify which chunks commit and which rows resume; measure processing rate, skip/retry counts and resource contention.

[S41] [S42]
Keep this: Restartability is a data contract, not a checkbox.
Check yourself: Does failure in chunk 8 undo chunks 1–7?

Normally no. Each completed chunk already committed within its own transaction boundary.

Part 23 · Applications

Spring Cloud: select distributed capabilities

Prerequisites: 01-ecosystem

Which distributed responsibility needs a component?

Client: broker portal; Gateway: routing policies; Application service: domain use case; Insurer service: HTTP contract; Configuration source: operational settings. Connections: Client to Gateway (request); Gateway to Application service (route); Application service to Insurer service (bounded client call); Configuration source to Application service (configuration)
Illustrative deployment, not a mandatory Cloud stack. Compatibility is governed by the selected release train. [S43] [S44] [S45]

Goal & mental model verified

Cloud projects supply distributed patterns: Config, Gateway, discovery, LoadBalancer, Circuit Breaker, Stream, Function and Task. Release trains coordinate compatible dependencies with a BOM.

[S43] [S44]

Worked example · design exercise synthesis

A gateway routes broker requests; a service calls an insurer using an HTTP client. On Kubernetes, evaluate whether platform discovery/configuration already supplies the needed capability before adding another layer.

[S43] [S44] [S45]

Engineering decision synthesis

Use RestClient for blocking calls, WebClient for reactive composition, or HTTP Service Clients for declarative interfaces. OpenFeign remains feature-complete; maintainers recommend HTTP Service Clients for new evolution.

[S43] [S44] [S45]

Pitfall & diagnosis synthesis

Cloud abstractions do not remove network failures or distributed consistency problems. The old docs/current Cloud URL can expose an old train; match documentation to the actual version.

[S43] [S44] [S45]

Improve & validate synthesis

Map each component to one operational need. Verify Boot/Cloud compatibility and timeout behavior, then remove duplicate discovery, routing or configuration responsibilities.

[S43] [S44] [S45]
Keep this: Distribute deliberately; pay the network bill consciously.
Check yourself: Should every Kubernetes service add Eureka?

No. First determine whether native discovery already meets the requirement.

Part 24 · Applications

REST, GraphQL, gRPC and hypermedia

Prerequisites: 01-ecosystem

How does GraphQL avoid repeated owner loads?

GraphQL selection: policies + owners; Field resolvers: owner keys; DataLoader: batch within request; Backing service: bounded lookup. Connections: GraphQL selection to Field resolvers (execute fields); Field resolvers to DataLoader (collect loads); DataLoader to Backing service (batch lookup)
One GraphQL mechanism. REST and gRPC are contract alternatives, not stages of this flow. [S46] [S47] [S62]

Goal & mental model verified

API styles expose different contracts. REST centers resources and HTTP semantics; GraphQL executes a schema-selected field graph; gRPC defines RPC services/messages. Spring HATEOAS helps express links and affordances in representations.

[S46] [S47]

Worked example · design exercise synthesis

A broker dashboard asks GraphQL for policies and owners. Request-scoped DataLoader batching can collect owner IDs, reducing repeated lookups without turning the API into one unrestricted database query.

[S46] [S47] [S62]

Engineering decision synthesis

Choose REST for familiar interoperable resource APIs, GraphQL for client-shaped graphs, and gRPC for typed RPC requirements. Consider client support, evolution, authorization and observability alongside payload size.

[S46] [S47] [S62]

Pitfall & diagnosis synthesis

GraphQL can hide N+1 fetching and expensive query shapes. Changing transport does not supply per-field/resource permissions. Hypermedia links should reflect permitted actions rather than grant authority themselves.

[S46] [S47] [S62]

Improve & validate synthesis

Measure query cost and downstream calls. Enforce workload limits and compatible contract evolution; keep authentication, authorization and deadline behavior explicit for each transport.

[S46] [S47] [S62]
Keep this: Transport changes the contract shape; business rules still need enforcement.
Check yourself: Does DataLoader guarantee one query for the entire request?

No. It batches compatible loads; actual queries depend on keys, resolvers and backing implementation.

Part 25 · Best practices

Tests that catch wiring, persistence and HTTP failures

Prerequisites: 01-ecosystem

Which test can prove the behavior?

Unit test: rule correctness; Slice test: selected framework boundary; Integration test: real infrastructure; Critical HTTP flow: application behavior. Connections: Unit test to Critical HTTP flow (rule confidence); Slice test to Critical HTTP flow (binding confidence); Integration test to Critical HTTP flow (persistence confidence)
These are complementary test scopes, not a required execution chain. Full-context does not automatically mean real external services. [S48] [S25]

Goal & mental model verified

Boot supports focused test slices and full-context tests. A slice loads a constrained subset; a full application test exercises broader wiring. Different scopes answer different questions.

[S48] [S25]

Worked example · design exercise synthesis

Test pricing rules with ordinary objects; validate controller errors with an MVC slice; exercise repository mappings against a representative database; reserve full application tests for critical integration flows.

[S48] [S25]

Engineering decision synthesis

Pick the cheapest test that can detect the targeted failure. Real infrastructure tests cost time but can expose SQL, serialization and configuration problems that mocks cannot.

[S48] [S25]

Pitfall & diagnosis synthesis

A mocked repository cannot establish real transaction rollback. Test-managed transactions can also conceal commit-time behavior; choose the test boundary to match the production failure.

[S48] [S25]

Improve & validate synthesis

Build a few high-value scenarios: authorization denial, conflict/rollback, malformed requests and startup misconfiguration. Track failure relevance rather than chasing coverage percentage alone.

[S48] [S25]
Keep this: Test the boundary where the defect can actually occur.
Check yourself: Can an MVC slice validate real database rollback?

Not by itself. It typically excludes the persistence infrastructure required to prove it.

Part 26 · Best practices

Actuator, observations, metrics and traces

Prerequisites: 01-ecosystem

Which signal answers which question?

HTTP operation: named observation; Metrics: bounded dimensions; Trace spans: request causality; Actuator endpoints: health + operational access; Runtime recording: CPU / locks / allocation. Connections: HTTP operation to Metrics (aggregate); HTTP operation to Trace spans (correlate)
Metrics aggregate, traces connect work, runtime recordings explain JVM behavior. Endpoint exposure is a separate security decision. [S49] [S50] [S15]

Goal & mental model verified

Actuator exposes operational endpoints under explicit exposure/security settings. Micrometer Observation can support metrics and tracing. Low-cardinality dimensions suit metric aggregation; high-cardinality identifiers can explode metric series.

[S49] [S50]

Worked example · design exercise synthesis

Observe quote latency by route template and outcome. Correlate a slow request through a trace; inspect database wait and JVM events instead of placing every policy ID in a metric label.

[S49] [S50] [S15]

Engineering decision synthesis

Design signals around an operational question: errors, latency, saturation and dependency behavior. Expose only required management capabilities and restrict sensitive endpoints.

[S49] [S50] [S15]

Pitfall & diagnosis synthesis

Health is not one universal status. Putting shared external outages into liveness can trigger needless restarts; readiness dependencies should reflect whether this instance can serve useful traffic.

[S49] [S50] [S15]

Improve & validate synthesis

Simulate slow insurer calls and database outages. Confirm traces propagate and alerts identify the constrained boundary; measure signal cardinality and retention costs.

[S49] [S50] [S15]
Keep this: A dashboard earns its place by answering a failure question.
Check yourself: Should policyId be a metric label?

Usually no. Its high cardinality can create excessive time series; use logs/traces appropriately.

Part 27 · Best practices

Timeouts, retries, bulkheads and scheduled work

Prerequisites: 01-ecosystem

When does retry improve reliability?

Overall deadline: finite budget; Concurrency limit: protect dependency; Dependency call: per-attempt timeout; Retry decision: transient + safe?; Final outcome: success or explicit failure. Connections: Overall deadline to Concurrency limit (admit); Concurrency limit to Dependency call (attempt); Dependency call to Retry decision (failure); Retry decision to Concurrency limit (bounded retry); Dependency call to Final outcome (success / exhausted)
Policy sketch, not annotation execution order. Retry and transaction nesting must be chosen deliberately. [S51] [S52] [S53]

Goal & mental model verified

Framework 7 has core retry and concurrency-limit facilities with explicit enabling. Circuit breakers address repeated dependency failure. Executors run tasks; schedulers decide when to trigger them. @Async commonly relies on proxy invocation.

[S51] [S52]

Worked example · design exercise synthesis

An insurer times out after receiving a quote request. Retry only under an idempotency contract; otherwise a successful but lost response can lead to duplicate work.

[S51] [S52] [S53]

Engineering decision synthesis

Set an overall deadline, per-attempt budgets and bounded concurrency. Retry selected transient failures with backoff/jitter; a fallback must preserve honest business semantics.

[S51] [S52] [S53]

Pitfall & diagnosis synthesis

Retries amplify overload. The new Framework retry API and older Spring Retry have different packages/settings. Scheduled work can run on every replica unless coordination is explicitly designed.

[S51] [S52] [S53]

Improve & validate synthesis

Inject latency, partial failure and response loss. Measure total attempts and deadline breaches; verify limits protect dependencies and that failed work has an observable final outcome.

[S51] [S52] [S53]
Keep this: Resilience protects a budget; it does not promise eventual success.
Check yourself: Is retrying every failure always safer?

No. Permanent failures waste capacity, and non-idempotent operations may repeat side effects.

Part 28 · Further improvements

Modulith: enforce domain boundaries before distribution

Prerequisites: 01-ecosystem

What is a legitimate module dependency?

Quotes module: internal rules; Policies API: published boundary; Policies internals: private implementation; Billing module: separate responsibility. Connections: Quotes module to Policies API (allowed dependency); Policies API to Policies internals (implementation); Policies API to Billing module (explicit collaboration)
Logical domain boundaries inside one process. The figure does not imply separate services or databases. [S54]

Goal & mental model verified

Spring Modulith derives application modules from a Boot application structure and supports boundary verification. Modules expose APIs/named interfaces while keeping implementation details internal.

[S54]

Worked example · design exercise synthesis

Separate quotes, policies and billing into modules. Quotes calls the published policy API or emits a domain event; it should not reach directly into billing’s internal persistence package.

[S54]

Engineering decision synthesis

Use a modular monolith when one deployment can satisfy operational needs. This preserves local interactions while clarifying boundaries, but independent scaling/deployment may later justify extraction.

[S54]

Pitfall & diagnosis synthesis

Package names alone cannot prevent coupling if public internals are widely imported. Replacing calls with events changes consistency and failure semantics; it is not automatically an improvement.

[S54]

Improve & validate synthesis

Run module dependency verification and focused module tests. Track coupling and change ownership before extracting a service; choose extraction based on an actual deployment constraint.

[S54]
Keep this: Make boundaries real before making them remote.
Check yourself: Does Modulith require microservices?

No. It is designed to structure modules within a Spring Boot application.

Part 29 · Further improvements

Spring AI: retrieval and tools with controlled authority

Prerequisites: 01-ecosystem

Who owns authority when the model calls a tool?

User question: authenticated caller; Authorized retrieval: tenant-scoped context; Model: answer / tool request; Application tool gate: validate + authorize; Business service: controlled action. Connections: User question to Authorized retrieval (retrieve); Authorized retrieval to Model (augment prompt); Model to Application tool gate (requested tool); Application tool gate to Business service (only if allowed)
Proposed guarded design grounded in Spring AI mechanisms; application authorization is not supplied by retrieval itself. [S55] [S56] [S57]

Goal & mental model verified

Spring AI offers model, embedding, vector-store and tool abstractions. RAG retrieves context for generation; tools let the model request application capabilities. The application executes those capabilities and owns the resulting authority.

[S55] [S56]

Worked example · design exercise synthesis

An assistant retrieves permitted policy wording and drafts an explanation. A requested issuePolicy tool must still validate the agent, tenant, eligibility and required approval in ordinary application code.

[S55] [S56] [S57]

Engineering decision synthesis

Use the framework to integrate models, not to outsource business authorization. Retrieval improves grounding under suitable data and chunking, but cannot guarantee factual correctness.

[S55] [S56] [S57]

Pitfall & diagnosis synthesis

Retrieved text and model output can be untrusted. A tool exposed to a model may have real side effects; prompt wording alone cannot enforce access rules or prevent repeated operations.

[S55] [S56] [S57]

Improve & validate synthesis

Build a small evaluation set covering wrong-tenant retrieval, unsupported answers and unsafe tool requests. Trace sources and measure correctness, latency and cost before broadening capabilities.

[S55] [S56] [S57]
Keep this: The model can suggest an action; the application must authorize it.
Check yourself: Does retrieved context make every answer true?

No. Retrieval can be incomplete or wrong, and generation can still misinterpret it.

Part 30 · Further improvements

AOT and native images: optimize the deployment case

Prerequisites: 01-ecosystem

What moves from runtime into the build?

Application + config: build inputs; Spring AOT: analyze + generate assets; Native build: closed-world analysis; Native executable: runtime behavior; Artifact tests: real integrations. Connections: Application + config to Spring AOT (analyze); Spring AOT to Native build (generated support); Native build to Native executable (execute); Native executable to Artifact tests (verify)
Simplified native-image pipeline; ahead-of-time processing and compilation are distinct steps. [S58] [S14]

Goal & mental model verified

Native images compile under a closed-world assumption. Spring AOT analyzes application assembly ahead of runtime and generates supporting assets. Dynamic bean-graph changes and reflection/resource access can require different handling.

[S58] [S14]

Worked example · design exercise synthesis

A rarely invoked quote utility may benefit from reduced startup overhead. A long-running service may favor JVM JIT behavior; measure both against the actual deployment workload.

[S58] [S14]

Engineering decision synthesis

Evaluate native deployment when startup and footprint constrain the product. Accept build complexity and compatibility work only when the measured operational benefit matters.

[S58] [S14]

Pitfall & diagnosis synthesis

A successful JVM run does not prove native compatibility. Runtime configuration that changes which beans exist can conflict with build-time assembly assumptions.

[S58] [S14]

Improve & validate synthesis

Test the native artifact itself, including serialization, resources and integrations. Compare cold start, steady-state throughput, memory and build time under equivalent conditions.

[S58] [S14]
Keep this: Optimize the lifecycle that dominates your real cost.
Check yourself: Can native mode freely rebuild its bean graph from runtime properties?

No. AOT/closed-world constraints limit runtime changes to application assembly.

Part 31 · Applications

Specialist Spring projects: choose the protocol

Prerequisites: 01-ecosystem

Which specialist fits the requirement?

External requirement: protocol or workflow; SOAP contract: Spring Web Services; Directory access: Spring LDAP; Resource links: Spring HATEOAS. Connections: External requirement to SOAP contract (XML schema); External requirement to Directory access (directory contract); External requirement to Resource links (hypermedia contract)
These are alternatives for distinct needs. REST Docs, Shell and Web Flow add other focused capabilities. [S01] [S60] [S61] [S62]

Goal & mental model verified

The portfolio includes specialist tools: Web Services for contract-first SOAP, LDAP for directory access, HATEOAS for links, REST Docs for tested documentation, Shell for CLIs and Web Flow for controlled navigation.

[S01] [S60]

Worked example · design exercise synthesis

Use SOAP integration for an insurer’s fixed XML contract; LDAP when identity data lives in a directory. Use REST Docs to connect documented API examples to tests rather than maintaining unrelated examples manually.

[S01] [S60] [S61] [S62]

Engineering decision synthesis

Match the external contract first, then select the adapter/framework. Specialized projects reduce plumbing but add protocol and lifecycle knowledge; they are not mandatory for every Boot application.

[S01] [S60] [S61] [S62]

Pitfall & diagnosis synthesis

An older tutorial may reference an Attic project as if it were a current default. Attic status requires checking migration/replacement guidance; it is not a blanket statement about every existing deployment.

[S01] [S60] [S61] [S62]

Improve & validate synthesis

Inventory specialty protocols and historical dependencies. Read each selected project’s current support and migration notes before adoption or replacement.

[S01] [S60] [S61] [S62]
Keep this: Use the smallest set of projects that honors your actual contracts.
Check yourself: Should a REST-only service add Spring Web Services?

Usually no. Its purpose is SOAP/XML-oriented service integration.

Part 32 · Further improvements

A production learning loop and migration compass

Prerequisites: 01-ecosystem

How does a better service become a proven service?

Baseline: known behavior; Hypothesis: one named constraint; One change: mechanism + cost; Measure + fail-test: correctness + operability; Decision: keep / revise / revert. Connections: Baseline to Hypothesis (observe); Hypothesis to One change (propose); One change to Measure + fail-test (validate); Measure + fail-test to Decision (assess); Decision to Baseline (new baseline)
This is an engineering synthesis, not a claim of measured performance gains for the example service. [S02] [S43] [S48] [S49] [S01]

Goal & mental model verified

A compatible runtime and framework baseline makes behavior reproducible. Verification spans business rules, framework wiring and operating signals. Portfolio status and compatibility documentation should guide version-sensitive choices.

[S02] [S43]

Worked example · design exercise synthesis

Baseline a quote service, add one change such as a fetch plan or concurrency limit, and repeat representative load and failure scenarios. Keep the result only when it improves the target without breaking invariants.

[S02] [S43] [S48] [S49] [S01]

Engineering decision synthesis

Start with one well-observed modular service. Add distributed components, caching, reactive execution or native compilation when a specific constraint justifies the complexity.

[S02] [S43] [S48] [S49] [S01]

Pitfall & diagnosis synthesis

Installing every project is not ecosystem mastery. A change that lowers average latency while worsening failure recovery or tenant isolation may be a regression.

[S02] [S43] [S48] [S49] [S01]

Improve & validate synthesis

Study in order: Java contracts → container/proxies → HTTP/data/security → failure handling → optional capabilities. Record expected benefit, measurement and rollback criteria for every production change.

[S02] [S43] [S48] [S49] [S01]
Keep this: Learn the mechanism, state the constraint, measure the change.
Check yourself: When should a new abstraction be adopted?

When its mechanism addresses a named constraint and evidence shows its benefit outweighs its cost.

Sources & further reading

  1. [S01] Spring portfolio and Attic

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Portfolio roles; Current projects and historical Attic entries

    Read the linked section to validate the mechanism and its version-specific constraints.

  2. [S02] Spring Boot system requirements

    Spring project maintainers · documentation · accessed 2026-10-09 · Spring Boot 4.1.1

    Supports: Boot 4.1.1 requires Java 17+ and Framework 7.0.9+; Supported Java range and build tools

    Read the linked section to validate the mechanism and its version-specific constraints.

  3. [S03] JLS: types, values, variables

    Oracle / OpenJDK · specification · accessed 2026-10-09 · Java SE 25

    Supports: Primitive/reference distinction; Generics and final references

    Read the linked section to validate the mechanism and its version-specific constraints.

  4. [S04] JLS: classes and records

    Oracle / OpenJDK · specification · accessed 2026-10-09 · Java SE 25

    Supports: Inheritance and interfaces; Record components and final fields

    Read the linked section to validate the mechanism and its version-specific constraints.

  5. [S05] Object equality and hashing

    Oracle / OpenJDK · documentation · accessed 2026-10-09 · Java SE 25

    Supports: equals/hashCode contract

    Read the linked section to validate the mechanism and its version-specific constraints.

  6. [S06] Collections package

    Oracle / OpenJDK · documentation · accessed 2026-10-09 · Java SE 25

    Supports: Collection roles and implementations

    Read the linked section to validate the mechanism and its version-specific constraints.

  7. [S07] HashMap API

    Oracle / OpenJDK · documentation · accessed 2026-10-09 · Java SE 25

    Supports: HashMap behavior and ordering limits

    Read the linked section to validate the mechanism and its version-specific constraints.

  8. [S08] Stream API

    Oracle / OpenJDK · documentation · accessed 2026-10-09 · Java SE 25

    Supports: Laziness; Terminal operations; Non-interference

    Read the linked section to validate the mechanism and its version-specific constraints.

  9. [S09] AutoCloseable

    Oracle / OpenJDK · documentation · accessed 2026-10-09 · Java SE 25

    Supports: Resource closure with try-with-resources

    Read the linked section to validate the mechanism and its version-specific constraints.

  10. [S10] BigDecimal

    Oracle / OpenJDK · documentation · accessed 2026-10-09 · Java SE 25

    Supports: Decimal arithmetic; Rounding; Scale-sensitive equality

    Read the linked section to validate the mechanism and its version-specific constraints.

  11. [S11] Concurrency utilities

    Oracle / OpenJDK · documentation · accessed 2026-10-09 · Java SE 25

    Supports: Executors and concurrency building blocks

    Read the linked section to validate the mechanism and its version-specific constraints.

  12. [S12] JLS: threads and locks

    Oracle / OpenJDK · specification · accessed 2026-10-09 · Java SE 25

    Supports: Happens-before; Visibility versus compound atomicity

    Read the linked section to validate the mechanism and its version-specific constraints.

  13. [S13] Virtual threads

    Oracle / OpenJDK · documentation · accessed 2026-10-09 · Java SE 25

    Supports: I/O concurrency; Do not pool virtual threads; Limit scarce resources

    Read the linked section to validate the mechanism and its version-specific constraints.

  14. [S14] HotSpot technology overview

    Oracle / OpenJDK · documentation · accessed 2026-10-09 · Java SE 25

    Supports: Interpreter and adaptive compilation; Garbage collection

    Read the linked section to validate the mechanism and its version-specific constraints.

  15. [S15] Flight Recorder guide

    Oracle / OpenJDK · documentation · accessed 2026-10-09 · Java SE 25

    Supports: JFR events and recordings for runtime diagnosis

    Read the linked section to validate the mechanism and its version-specific constraints.

  16. [S16] Dependency injection

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Constructor injection; Dependency resolution

    Read the linked section to validate the mechanism and its version-specific constraints.

  17. [S17] Bean scopes

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Singleton per container and bean; Prototype lifecycle limits

    Read the linked section to validate the mechanism and its version-specific constraints.

  18. [S18] Bean lifecycle

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Initialization and destruction callbacks; Lifecycle management

    Read the linked section to validate the mechanism and its version-specific constraints.

  19. [S19] Spring AOP proxies

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Proxy interception; Self-invocation bypass; Subclass limitations

    Read the linked section to validate the mechanism and its version-specific constraints.

  20. [S20] Bean and Configuration

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Java bean definitions; Configuration classes

    Read the linked section to validate the mechanism and its version-specific constraints.

  21. [S21] Boot auto-configuration

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Conditional configuration; User beans can replace defaults

    Read the linked section to validate the mechanism and its version-specific constraints.

  22. [S22] Externalized configuration

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Property source precedence; ConfigurationProperties binding

    Read the linked section to validate the mechanism and its version-specific constraints.

  23. [S23] DispatcherServlet

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Front controller delegates MVC request processing

    Read the linked section to validate the mechanism and its version-specific constraints.

  24. [S24] MVC validation

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Request and method validation

    Read the linked section to validate the mechanism and its version-specific constraints.

  25. [S25] HTTP error responses

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: ProblemDetail; Central exception handling

    Read the linked section to validate the mechanism and its version-specific constraints.

  26. [S26] WebFlux overview

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Non-blocking execution; Backpressure; MVC applicability

    Read the linked section to validate the mechanism and its version-specific constraints.

  27. [S27] Spring Data query methods

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Derived queries and repository method contracts

    Read the linked section to validate the mechanism and its version-specific constraints.

  28. [S28] Spring Data JPA fetch plans

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: EntityGraph; Scrolling; JPA query customization

    Read the linked section to validate the mechanism and its version-specific constraints.

  29. [S29] Why Spring Data JDBC

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: JDBC aggregate mapping without JPA persistence context

    Read the linked section to validate the mechanism and its version-specific constraints.

  30. [S30] Declarative transactions

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Proxy entry required; Rollback defaults; Global rollback customization

    Read the linked section to validate the mechanism and its version-specific constraints.

  31. [S31] JPA transaction boundaries

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Service facade boundaries; Read-only is an optimization hint

    Read the linked section to validate the mechanism and its version-specific constraints.

  32. [S32] Security servlet architecture

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: FilterChainProxy; SecurityFilterChain; Authentication and authorization

    Read the linked section to validate the mechanism and its version-specific constraints.

  33. [S33] JWT resource server

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: JWT verification; Issuer validation; Claim-to-authority conversion

    Read the linked section to validate the mechanism and its version-specific constraints.

  34. [S34] CSRF protection

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Browser ambient credentials; CSRF threats and tokens

    Read the linked section to validate the mechanism and its version-specific constraints.

  35. [S35] Spring Session

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Session abstraction; Shared session implementations

    Read the linked section to validate the mechanism and its version-specific constraints.

  36. [S36] Cache abstraction

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: CacheManager delegates to backing cache

    Read the linked section to validate the mechanism and its version-specific constraints.

  37. [S37] Cache annotations

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Cacheable and eviction; Key design and proxy behavior

    Read the linked section to validate the mechanism and its version-specific constraints.

  38. [S38] Kafka exactly-once semantics

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Kafka transactional read/process/write boundary

    Read the linked section to validate the mechanism and its version-specific constraints.

  39. [S39] AMQP asynchronous consumer

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Listener containers and acknowledgement modes

    Read the linked section to validate the mechanism and its version-specific constraints.

  40. [S40] Integration overview

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Messages; Channels; Routers; Adapters

    Read the linked section to validate the mechanism and its version-specific constraints.

  41. [S41] Batch chunks

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Reader/processor/writer; Commit intervals

    Read the linked section to validate the mechanism and its version-specific constraints.

  42. [S42] Batch domain model

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: JobInstance; JobExecution; StepExecution; Restart metadata

    Read the linked section to validate the mechanism and its version-specific constraints.

  43. [S43] Spring Cloud roles and compatibility

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Cloud project roles; Compatible release train BOMs

    Read the linked section to validate the mechanism and its version-specific constraints.

  44. [S44] REST clients

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: RestClient; WebClient; HTTP service proxies; RestTemplate deprecated in Framework 7

    Read the linked section to validate the mechanism and its version-specific constraints.

  45. [S45] OpenFeign status

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Feature-complete status; Maintainer recommendation to HTTP service clients

    Read the linked section to validate the mechanism and its version-specific constraints.

  46. [S46] GraphQL request execution

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Schema execution; DataLoader per-request batching

    Read the linked section to validate the mechanism and its version-specific constraints.

  47. [S47] Spring gRPC

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Spring-friendly gRPC integrations

    Read the linked section to validate the mechanism and its version-specific constraints.

  48. [S48] Boot testing

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Test slices; SpringBootTest; Different test scopes

    Read the linked section to validate the mechanism and its version-specific constraints.

  49. [S49] Boot observability

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Micrometer Observation; Metrics/tracing; Cardinality

    Read the linked section to validate the mechanism and its version-specific constraints.

  50. [S50] Actuator endpoints

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Endpoint exposure and security; Liveness/readiness

    Read the linked section to validate the mechanism and its version-specific constraints.

  51. [S51] Framework resilience

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Framework 7 retry/concurrency limit; EnableResilientMethods

    Read the linked section to validate the mechanism and its version-specific constraints.

  52. [S52] Cloud Circuit Breaker

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Circuit breaker abstraction

    Read the linked section to validate the mechanism and its version-specific constraints.

  53. [S53] Scheduling and async

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Executor/scheduler distinction; Async proxy invocation

    Read the linked section to validate the mechanism and its version-specific constraints.

  54. [S54] Modulith fundamentals

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Module boundaries; Named interfaces; Dependency verification

    Read the linked section to validate the mechanism and its version-specific constraints.

  55. [S55] Spring AI introduction

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Model abstractions; Embeddings and vector stores

    Read the linked section to validate the mechanism and its version-specific constraints.

  56. [S56] Spring AI tools

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Tool callbacks; Model requests tools; application executes

    Read the linked section to validate the mechanism and its version-specific constraints.

  57. [S57] Spring AI RAG

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Retrieval and augmentation components

    Read the linked section to validate the mechanism and its version-specific constraints.

  58. [S58] Native image constraints

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Closed-world assumption; AOT processing; Runtime bean graph constraints

    Read the linked section to validate the mechanism and its version-specific constraints.

  59. [S59] Spring Pulsar

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Spring template/listener abstractions for Pulsar

    Read the linked section to validate the mechanism and its version-specific constraints.

  60. [S60] Spring Web Services

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Contract-first SOAP; XML schema and message endpoints

    Read the linked section to validate the mechanism and its version-specific constraints.

  61. [S61] Spring LDAP

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: LDAP integration

    Read the linked section to validate the mechanism and its version-specific constraints.

  62. [S62] Spring HATEOAS

    Spring project maintainers · documentation · accessed 2026-10-09 · Documentation retrieved 2026-10-09

    Supports: Representation models; Links and affordances

    Read the linked section to validate the mechanism and its version-specific constraints.

Framework & portfolio capability compass

Framework capability compass

Capability map; follow the topic sheets for mechanisms and trade-offs. [S63] [S65] [S66] [S67] [S68] [S69] [S70]

Capability / projectResponsibilityStudy next
Core / Beans / ContextContainer, metadata, bean assembly and application services08–11
AOP / aspectsCross-cutting interception; proxy versus weaving10
Resources / SpELResource access and expression evaluationCore reference
Binding / conversion / validationMap inputs to typed values; validate constraints12–13
Transactions / JDBC / ORMPersistence infrastructure and transaction boundaries15–16
Web / MVC / WebFluxHTTP infrastructure and two execution models13–14
MVC delegate beansHandlerMapping, HandlerAdapter, conversion, errors and localizationMVC special beans
Messaging / JMSMessaging abstractions and JMS templates/listeners20–21
WebSocket / STOMPFull-duplex communication and message-oriented web interactionWebSocket reference
Cache / scheduling / asyncResult reuse, task triggering and execution19 / 27
Test / AOT / resilienceVerification, ahead-of-time processing and failure controls25 / 27 / 30

Spring Data store compass

Capability map; follow the topic sheets for mechanisms and trade-offs. [S64]

Capability / projectResponsibilityStudy next
CommonsShared repository foundationsRepository contracts
JPAJPA repositories15–16
Relational: JDBC / R2DBCBlocking aggregates / non-blocking relational access14–15
MongoDBDocument mapping and repositoriesDocument boundaries
RedisRedis access and integration19 / 18
Cassandra / CouchbaseStore-specific accessPartitioning / document semantics
Elasticsearch / Neo4jSearch / graph accessIndex / graph query design
KeyValue / LDAPKey-value / directory repositoriesStore contract
Data RESTRepository-driven hypermedia resources24; review exposed operations
Community adaptersAdditional stores; support variesCheck ownership and support

Spring Cloud capability compass

Capability map; follow the topic sheets for mechanisms and trade-offs. [S43] [S45]

Capability / projectResponsibilityStudy next
Config / BusConfiguration / change distribution12 / 23
Gateway / LoadBalancerRouting / instance selection23
Netflix Eureka / Consul / ZookeeperDiscovery integrationsAvoid duplicate platform discovery
KubernetesPlatform integration23
Circuit BreakerFailure isolation abstraction27
StreamBroker-bound application messaging20
Function / TaskFunction model / finite workloads22–23
VaultSecrets integration12
OpenFeignDeclarative HTTP integration; feature-completeHTTP Service Clients guidance

Specialist and adjacent capabilities

Capability map; follow the topic sheets for mechanisms and trade-offs. [S01] [S60] [S61] [S62]

Capability / projectResponsibilityStudy next
Security / SessionIdentity, access rules and session handling17–18
Batch / IntegrationBulk jobs / message routing21–22
Kafka / AMQP / PulsarBroker-specific templates and listeners20
GraphQL / gRPC / HATEOASSchema graphs / RPC / resource links24
Modulith / AIModule boundaries / model integration28–29
REST Docs / Shell / Web FlowTested API docs / CLIs / navigation flows31
Web Services / LDAPSOAP / directory integration31
Micrometer / ReactorObservability / reactive foundation26 / 14
Attic examplesSleuth, Retry, Cloud Contract, Data Flow, Statemachine, Authorization Server appear in retrieved Attic listCheck project-specific migration and support guidance

This compass maps responsibilities, not interchangeable APIs or a promise that every listed project shares the same support lifecycle. Core mechanisms receive dedicated lessons; niche protocols and provider-specific integrations remain further-reading branches.

[S63] Framework module overview · accessed 2026-10-09

[S64] Spring Data family · accessed 2026-10-09

[S65] Binding, conversion and validation · accessed 2026-10-09

[S66] Spring Expression Language · accessed 2026-10-09

[S67] Framework WebSockets · accessed 2026-10-09

[S68] Framework JMS · accessed 2026-10-09

[S69] MVC configuration · accessed 2026-10-09

[S70] MVC special beans · accessed 2026-10-09