For the complete documentation index, see llms.txt. This page is also available as Markdown.

Application.bx

Create virtual applications in memory with isolated settings, lifecycle events, and persistence scopes across all BoxLang runtimes

🌏 Overview

Application.bx is BoxLang's application framework - a powerful feature that allows you to define virtual applications in memory with isolated settings, lifecycle events, and persistence scopes. This works across all BoxLang runtimes: web servers (CommandBox, MiniServer), CLI applications, Lambda functions, desktop applications, and more.

The Big Picture: Virtual Applications

BoxLang creates isolated virtual applications within a single JVM process:

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃                    BoxLang Runtime (JVM)                 ┃
┃                                                          ┃
┃  ┌──────────────────────-┐   ┌──────────────────────┐    ┃
┃  │  Application: "App1"  │   │  Application: "App2" │    ┃
┃  │  ───────────────────  │   │  ─────────────────── │    ┃
┃  │  📦 application{}     │   │  📦 application{}    │    ┃
┃  │  👤 session{}         │   │  👤 session{}        │    ┃
┃  │  ⚙️  Config Settings  │   │  ⚙️  Config Settings │    ┃
┃  │  🗄️  Datasources      │   │  🗄️  Datasources     │    ┃
┃  │  🧩 Lifecycle Events  │   │  🧩 Lifecycle Events │    ┃
┃  └───────────────────────┘   └──────────────────────┘    ┃
┃          ↑ ↑ ↑                     ↑ ↑ ↑                 ┃
┃       Requests from              Requests from           ┃
┃       /app1/** tree              /app2/** tree           ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Each Application.bx creates a completely isolated virtual application with its own memory space, configuration, and lifecycle - all running in the same JVM.

What is Application.bx?

Application.bx is a special BoxLang class file that serves two primary purposes:

  1. Application Configuration - Define application-wide settings in the pseudo-constructor using the this scope:

    • Application name and timeouts

    • Datasource configurations

    • Caching strategies

    • Session management

    • File mappings and class paths

    • Java library integration

    • Security settings

    • Custom schedulers and much more

  2. Lifecycle Event Handlers - Implement callback methods that BoxLang executes automatically at key points:

    • Application startup/shutdown

    • Session creation/destruction

    • Request processing (start, execute, end)

    • Error handling

    • Missing templates

    • Class invocations

How It Works

When BoxLang executes any code (web request, CLI script, Lambda function), it searches for Application.bx starting from the current directory and traversing upward through parent directories until found or reaching the root.

Application.bx Discovery Process

Nested Applications Example

📋 Table of Contents

Directory Scope: The Application.bx file applies to its directory and all subdirectories. Any BoxLang code in that tree will automatically use this application context.

Transient Nature

Application.bx is instantiated on every request - this is a critical feature that provides multi-tenancy for any BoxLang web application out of the box:

Dynamic Configuration - Modify settings per-request based on conditions:

  • Switch datasources based on subdomain or user

  • Adjust session timeouts for bot detection

  • Enable/disable features based on environment

  • Dynamic security rules

Request-Level Customization - Each request can have unique behavior while sharing the same application memory space

⚠️ Performance Consideration - Since it runs on every request, keep the pseudo-constructor logic optimized. Use the application scope for expensive operations that should only run once.

Application.bx Instantiation vs Application Memory

The Key Insight:

  • 🔄 Application.bx class = Created and destroyed with every request

  • 💾 application scope = Persists in memory and shared across all requests

Multi-Runtime Support

Application.bx works seamlessly across all BoxLang deployment targets:

Runtime
Use Case
Application.bx Behavior

Web Servers

CommandBox, MiniServer, JEE

Full support with sessions, cookies, web scopes

CLI

Scripts, automation, tools

Application scope, no web-specific features

AWS Lambda

Serverless functions

Application scope, cold start optimization

Google Cloud Functions

Serverless functions

Application scope, cold start optimization

Desktop

Electron, JavaFX apps

Application scope, local persistence

📝 Complete Example

⚙️ Configuration Settings

⚙️ Configuration Settings

All configuration settings are defined in the pseudo-constructor using the this scope. Here's a comprehensive reference of available settings:

Core Application Settings

Setting
Type
Default
Description

this.name

string

Generated

Unique application name. Defines the memory space reservation

this.applicationTimeout

timespan

0,0,0,0

Application lifetime. Default 0,0,0,0 = never expires (recommended)

this.locale

string

JVM locale

Default locale (e.g., "en_US", "es-ES")

this.timezone

string

JVM timezone

IANA timezone (e.g., "UTC", "America/New_York")

Session Management (Web Runtime)

Setting
Type
Default
Description

this.sessionManagement

boolean

false

Enable session tracking

this.sessionTimeout

timespan

0,0,30,0

Session lifetime (30 minutes default)

this.sessionStorage

string

"memory"

Cache name for session storage or "memory"

this.setClientCookies

boolean

true

Automatically set session cookies

this.setDomainCookies

boolean

false

Share cookies across subdomains

Datasources

Setting
Type
Description

this.datasource

string

Default datasource name

this.defaultDatasource

string

Alias for this.datasource

this.datasources

struct

Datasource definitions

Example:

See datasource configuration for full configuration details.

Caching

Define application-specific caches that BoxLang manages automatically:

See Caching documentation for full configuration details.

Mappings

Define virtual paths for class and file resolution:

As of BoxLang 1.6.0, mappings support both simple (string) and complex (struct) formats:

Java Integration

Load Java libraries and manage class loading:

See Java Integration documentation for details.

Custom Schedulers

Register scheduler classes that run automatically:

See Asynchronous Programming documentation for scheduler details.

Custom Watchers

Register application-scoped file watchers that auto-start when the application starts:

Watcher listener values support these forms:

Listener Form
Example
Notes

Closure

listener : ( event ) => println( event.kind )

Handles all events through a single function.

Struct of closures

listener : { onModify : ( e ) => ... }

Event-specific handlers such as onModify().

Class name string

listener : "app.listeners.HotReloadListener"

Runtime instantiates the class automatically.

Class instance

listener : new app.listeners.HotReloadListener()

Reuses the already created class instance.

Watcher definition keys in this.watchers.<watcherName> support these values:

Key
Type
Required
Default
Description

paths

string or array

Yes

-

Directory path or array of directory paths to watch.

listener

any

Yes

-

Closure, struct of closures, class name string, or class instance.

recursive

boolean

No

true

Watch subdirectories recursively.

debounce

long

No

0

Debounce window in milliseconds.

throttle

long

No

0

Throttle window in milliseconds.

atomicWrites

boolean

No

true

Reduce noisy temp-file/rename save events.

errorThreshold

integer

No

10

Consecutive listener errors before watcher auto-stops (0 disables auto-stop).

Application watchers are namespaced per app as applicationName:watcherName and are started automatically during application startup.

See Directory + File Watchers for listener method contracts and complete runtime APIs.

Security Settings

Setting
Type
Default
Description

this.invokeImplicitAccessor

boolean

Context

Enable implicit getters/setters

this.allowedFileOperationExtensions

array

Runtime

File extensions allowed for file operations

this.disallowedFileOperationExtensions

array

Runtime

File extensions disallowed for file operations

See security configuration for full details.

Advanced Settings

Setting
Type
Description

this.classPaths

array

Global class paths for .bx files

this.componentPaths

array

Alias for classPaths

this.customComponentPaths

array

Custom component directories

🔄 Lifecycle Events

🔄 Lifecycle Events

Application.bx acts as a comprehensive event listener, with BoxLang automatically invoking callback methods at key moments in your application's lifecycle.

Application Lifecycle

onApplicationStart()

Executed once when the application first starts - when the first request arrives and the application doesn't exist in memory.

When it runs:

  • First request after server startup

  • After application timeout expires

  • After applicationStop() is called

onApplicationEnd( struct applicationScope )

Executed once when the application shuts down due to timeout or explicit stop.

Session Lifecycle (Web Runtime Only)

onSessionStart()

Executed when a new user session begins.

onSessionEnd( struct sessionScope, struct applicationScope )

Executed when a session expires or is explicitly terminated.

Request Lifecycle

onRequestStart( string targetPage )

Executed at the start of every request, before the target page is processed.

Return Value:

  • true - Continue processing the request

  • false - Abort the request (no further processing)

onRequest( string targetPage )

Wraps the entire request execution. You control if/how the target page is included.

Pattern: Think of onRequestStart() as "before advice" and onRequest() as "around advice" in AOP terms. If you implement onRequest(), you must include the target page yourself.

onRequestEnd()

Executed after the request completes, even if errors occurred.

Error Handling

onError( any exception, string eventName )

Global error handler - catches any unhandled exceptions in your application.

Parameters:

  • exception - The exception struct with message, detail, type, stacktrace, etc.

  • eventName - Which lifecycle event threw the error (e.g., "onRequestStart", "onApplicationStart")

onAbort( required string targetPage )

Executed when abort() is called anywhere in the request.

Special Handlers

onMissingTemplate( required string targetPage )

Executed when a requested template doesn't exist - your custom 404 handler.

onClassRequest( className, method, struct args )

Intercepts remote class invocations (HTTP/AMF calls to BoxLang classes).

Execution Order

🏗️ Virtual Applications - A Critical Feature

🏗️ Virtual Applications - A Critical Feature

One of BoxLang's most powerful capabilities is the ability to create multiple virtual applications within a single JVM process. Each application is a memory space reservation with isolated scopes and settings.

How Virtual Applications Work

Each Application.bx with a unique this.name creates a separate virtual application. These applications:

✅ Have their own isolated application scope and timeout

✅ Have their own isolated session scopes (web runtime), caches and timeouts

✅ Can have completely different settings and configurations

✅ Share the same JVM but are logically independent

✅ Can be nested or side-by-side in the directory structure

Example: Multiple Apps in One Server

Result: Three independent applications running in the same JVM:

  • PublicSite - Public website with 30-day application timeout

  • AdminConsole - Admin area with 1-hour session timeout and different datasource

  • RestAPI - API endpoints with no session management

Practical Example

Scope Isolation

Application Longevity

Applications live in memory for the duration specified by this.applicationTimeout:

When an application expires:

  1. onApplicationEnd() is called

  2. Application scope is destroyed

  3. Next request triggers onApplicationStart() and creates a new application instance

Manual Control:

Why you can't "kill" the application scope: Applications are time-based memory reservations. They expire automatically based on applicationTimeout or when explicitly stopped with applicationStop().

Use Cases for Virtual Applications

🎯 Multi-Tenant SaaS

🎯 Microservices Architecture

🎯 Environment Separation

🎯 Legacy Migration

📚 Additional Resources

CFML Compatibility: For CFML compatibility reference, see CFDocs Application.cfc. BoxLang supports the majority of CFML Application.cfc features with enhanced capabilities.

Last updated

Was this helpful?