Package dev.relism.flash.extension
Interface FlashExtension
- All Known Implementing Classes:
BaseViewExtension,DataExtension,JacksonExtension,JteExtension,LimiterExtension,OidcExtension,OpenApiExtension,RouteViewerExtension,ThymeleafExtension,WebBundlerExtension
public interface FlashExtension
Two-phase contract for all Flash extensions.
Extension lifecycle inside FlashApp.start():
- Extensions are sorted by
priority()— lower value runs first. - Provide phase —
provide(FlashContext)is called for all installed extensions. Use this phase to register services, annotation processors, and route listeners. Never callFlashContext.require(java.lang.Class<T>)here. - Context resolution —
FlashContext.resolveAll()performs topological resolution of lazy suppliers. Circular or missing dependencies fail here with a clear message before any request is served. - Routes phase —
routes(FlashRegistrar, FlashContext)is called for all extensions. All services are resolved;FlashContext.require(java.lang.Class<T>)is safe.
Priority and middleware ordering
priority() controls the order annotation processors are registered, which
determines the annotation-layer middleware chain position:
Request ──► EARLY processors' mw ──► DEFAULT processors' mw ──► LATE processors' mw ──► handlerUse
ExtensionPhase constants for semantic ordering:
@Override public int priority() { return ExtensionPhase.EARLY.value; }
Example
public class MetricsExtension implements FlashExtension {
@Override public int priority() { return ExtensionPhase.LATE.value; }
@Override
public void provide(FlashContext ctx) {
ctx.provide(MetricsRegistry.class, new PromMetricsRegistry());
}
@Override
public void routes(FlashRegistrar<?> app, FlashContext ctx) {
app.get("/metrics", (req, res) -> ctx.require(MetricsRegistry.class).scrape());
}
}
-
Method Summary
Modifier and TypeMethodDescriptiondefault intpriority()Execution priority.default voidprovide(FlashContext ctx) Phase 1 — register services and processors.default voidroutes(FlashRegistrar<?> app, FlashContext ctx) Phase 2 — register routes.
-
Method Details
-
provide
Phase 1 — register services and processors. Safe:FlashContext.provide(java.lang.Class<T>, T),FlashContext.supply(java.lang.Class<T>, java.util.function.Supplier<T>),FlashContext.addAnnotationProcessor(dev.relism.flash.extension.AnnotationProcessor),FlashContext.addRouteListener(dev.relism.flash.extension.RouteListener). Unsafe:FlashContext.require(java.lang.Class<T>)(services not yet resolved). -
routes
Phase 2 — register routes. All services are fully resolved.FlashContext.require(java.lang.Class<T>)is safe here. -
priority
default int priority()Execution priority. Lower = earlier in the annotation middleware chain. Tie-breaking: same value → install order (sort is stable). Default:ExtensionPhase.DEFAULT(500).
-