Search code examples
javaspring-bootsystem-properties

Can I define System Properties within Spring Boot configuration files?


I have a single application.yml configuration file for my Spring Boot app that defines two profiles (as described in the documentation).

When the production profile is enabled, I would like to set the http.maxConnections system property to a custom value, e.g.

spring:
    profiles:
        active: dev
---
spring:
    profiles: dev
---
spring:
    profiles: production
http:
    maxConnections: 15

But this doesn't actually set the system level property; it appears to just create an application-level property. I've verified this through both http://locahost:8080/env and a JMX Console when comparing launching by

java -jar -Dspring.profiles.active=production myapp.jar

versus

java -Dhttp.maxConnections=15 myapp.jar

I suppose I could create a bean that's @Conditional on the "production" profile that programmatically callsSystem.setProperty based on my application.yml-defined property, but is there a simpler way through configuration files alone?


Solution

  • I suppose I could create a bean that's @Conditional on the "production" profile that programmatically callsSystem.setProperty based on my application.yml-defined property, but is there a simpler way through configuration files alone?

    I think that's your best bet here. Spring Boot does that itself in its LoggingSystem where various logging.* properties are mapped to System properties.

    Note that you'll probably want to set the system properties as early as possible, probably as soon as the Environment is prepared. To do so, you can use an ApplicationListener that listens for the ApplicationEnvironmentPreparedEvent. Your ApplicationListener implementation should be registered via an entry in spring.factories.