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.
Key Feature: With a single Application.bx file or a hierarchy of them, you can create virtual applications in memory, each with its own isolated application, session, and configuration space - all within the same JVM process.
What is Application.bx?
Application.bx is a special BoxLang class file that serves two primary purposes:
Application Configuration - Define application-wide settings in the pseudo-constructor using the
thisscope: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
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.
π Table of Contents
Transient Nature
Application.bx is instantiated on every request - this is a critical feature that provides:
β 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.
Multi-Runtime Support
Application.bx works seamlessly across all BoxLang deployment targets:
Web Servers
CommandBox, MiniServer, JEE
Full support with sessions, cookies, web scopes
CLI
Scripts, automation, tools
Application scope, no web-specific features
Lambda
Serverless functions
Application scope, cold start optimization
Desktop
Electron, JavaFX apps
Application scope, local persistence
Web-Only Scopes: Features like session, cookie, form, url, and cgi scopes only exist in web runtimes. Structure your code to handle different runtime contexts gracefully.
π Complete Example
βοΈ 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
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)
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
Session Cookie Configuration (Web Runtime)
Datasources
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.
Security Settings
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
this.classPaths
array
Global class paths for .bx files
this.componentPaths
array
Alias for classPaths
this.customComponentPaths
array
Custom component directories
Please note that ANY module can also listen to the Application.bx and be able to provide their own settings and configurations. Examples of these are the bx-mail, bx-orm and other modules. So make sure you validate those setttings with the appropriate module.
π 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()
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 )
onApplicationEnd( struct applicationScope )Executed once when the application shuts down due to timeout or explicit stop.
Session Lifecycle (Web Runtime Only)
onSessionStart()
onSessionStart()Executed when a new user session begins.
onSessionEnd( struct sessionScope, struct applicationScope )
onSessionEnd( struct sessionScope, struct applicationScope )Executed when a session expires or is explicitly terminated.
Session events only fire in web runtimes with sessionManagement = true.
Request Lifecycle
onRequestStart( string targetPage )
onRequestStart( string targetPage )Executed at the start of every request, before the target page is processed.
Return Value:
true- Continue processing the requestfalse- Abort the request (no further processing)
onRequest( string targetPage )
onRequest( string targetPage )Wraps the entire request execution. You control if/how the target page is included.
onRequestEnd()
onRequestEnd()Executed after the request completes, even if errors occurred.
Error Handling
onError( any exception, string eventName )
onError( any exception, string eventName )Global error handler - catches any unhandled exceptions in your application.
Parameters:
exception- The exception struct withmessage,detail,type,stacktrace, etc.eventName- Which lifecycle event threw the error (e.g., "onRequestStart", "onApplicationStart")
onAbort( required string targetPage )
onAbort( required string targetPage )Executed when abort() is called anywhere in the request.
Special Handlers
onMissingTemplate( required string targetPage )
onMissingTemplate( required string targetPage )Executed when a requested template doesn't exist - your custom 404 handler.
onClassRequest( className, method, struct args )
onClassRequest( className, method, struct args )Intercepts remote class invocations (HTTP/AMF calls to BoxLang classes).
Execution Order
Framework Integration: The ColdBox HMVC Framework leverages these lifecycle methods to provide a rich event-driven architecture. Create a ColdBox app: coldbox create app MyApp
ποΈ 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 timeoutAdminConsole- Admin area with 1-hour session timeout and different datasourceRestAPI- API endpoints with no session management
Practical Example
Scope Isolation
Application Longevity
Applications live in memory for the duration specified by this.applicationTimeout:
Recommended: Keep the default 0,0,0,0 (never expires) unless you have a specific need for applications to restart automatically. This provides better performance and stability.
When an application expires:
onApplicationEnd()is calledApplication scope is destroyed
Next request triggers
onApplicationStart()and creates a new application instance
Manual Control:
Use Cases for Virtual Applications
π― Multi-Tenant SaaS
π― Microservices Architecture
π― Environment Separation
π― Legacy Migration
Best Practice: Use descriptive, unique application names. Avoid dynamic names unless you understand the implications for memory management.
π Additional Resources
Configuration: See Configuration documentation for runtime-level settings
Caching: See Caching documentation for cache strategies
Async: See Asynchronous Programming for schedulers and executors
Datasources: See Datasource configuration
Java Integration: See Java Integration for loading Java libraries
Last updated
Was this helpful?
