Şuayb's BlogŞuayb's Blog
Home
Categories
Games
MediumAboutContact
Language
Theme
    1. Blog
    2. Programming
    3. Spring Boot Configuration Properties

Spring Boot Configuration Properties

PublishedFebruary 4, 2026
UpdatedFebruary 17, 2026
Reading time3 min read
JavaKotlinSpring BootConfiguration
XLinkedInFacebook
Spring Boot Configuration Properties

Loading likes...

Last updatedFebruary 17, 2026

Total viewsLoading hits...

Previous articleSpring Boot GraphQL JWE AuthenticationNext articleCaptain Tsubasa: Rise of New Champions
Şuayb Şimşek

Written by

Şuayb Şimşek

Backend-focused fullstack developer sharing practical notes on Spring Boot, security, microservices, and cloud-native architecture.

Expertise

  • Spring Boot
  • Go
  • Microservices
  • Next.js
  • Cloud Native

Connect

GitHubLinkedInMedium

Related posts

Spring Boot GraphQL JWE Authentication
Programming

Spring Boot GraphQL JWE Authentication

Learn how to secure your Spring Boot GraphQL APIs with stateless encrypted JWTs (JWE) while persisting user identities and roles in a JPA-backed database.

May 17, 20256 min read
JavaKotlinSpring BootSecurityJWTJWEGraphQL
Spring Boot JWE Authentication with JPA
Programming

Spring Boot JWE Authentication with JPA

Learn how to use stateless encrypted JWTs (JWE) to secure your Spring Boot APIs while persisting user identities and roles in a JPA-backed database.

May 11, 20254 min read
JavaKotlinSpring BootSecurityJWTJWEJPA
Spring Boot LDAP and JWE Authentication
Programming

Spring Boot LDAP and JWE Authentication

Learn how to use LDAP authentication with JWE-encrypted JWTs to secure your Spring Boot APIs with both external directory integration and token confidentiality.

May 10, 20253 min read
JavaKotlinSpring BootSecurityJWTJWELDAP

About

Articles on Spring Boot, microservices, security, and more.

ContactStart here

Latest posts

  • Captain Tsubasa 2: World Fighters
  • Captain Tsubasa: Rise of New Champions
  • Spring Boot Configuration Properties
  • Spring Boot GraphQL JWE Authentication
  • Spring Boot JWE Authentication with JPA

Top topics

JavaKotlinSpring BootJWEJWTMicroservice

Subscribe

Get practical backend + fullstack notes when new articles are published.

Social

© 2024-2026 Şuayb's Blog. All rights reserved.

If you’ve ever ended up with a dozen @Value annotations and no idea which settings are required, @ConfigurationProperties is the Spring Boot way to make configuration type-safe, structured, and validatable.

In this post, you’ll learn:

  • How to model configuration as a class (Java/Kotlin)
  • How to validate configuration at startup
  • How profile-specific config files (application-{profile}.yml) override defaults

🌟 Why @ConfigurationProperties?

In this section, we clarify Why @ConfigurationProperties? and summarize the key points you will apply in implementation.

  • ✅ Type-safe access to config (IDE autocomplete, refactoring-safe)
  • ✅ Group and document related settings under a single prefix
  • ✅ Validate misconfigurations early (fail fast on startup)

📋 Prerequisites

In this section, we clarify Prerequisites and summarize the key points you will apply in implementation.

  • Java 17+
  • Spring Boot 3.x
  • Maven or Gradle

🛠️ Step 1: Define configuration in application.yml

Create a namespace (prefix) for your app config, for example app:

YAMLapplication.yml
app:
  security:
    enabled: true
    token-expiry-seconds: 3600
  allowed-origins:
    - 'https://example.com'
    - 'http://localhost:3000'

🛠️ Step 2: Create a @ConfigurationProperties class


🛠️ Step 3: Enable configuration properties

You have two common options:

  1. Scan for @ConfigurationProperties types:
JAVADemoApplication.java
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;

@SpringBootApplication
@ConfigurationPropertiesScan
public class DemoApplication {}
  1. Register specific classes explicitly:
JAVADemoApplication.java
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@SpringBootApplication
@EnableConfigurationProperties(AppProperties.class)
public class DemoApplication {}

🧪 Step 4: Validate properties at startup (fail fast)

Add validation constraints and annotate the class with @Validated.

Note: you need a Bean Validation implementation on the classpath (e.g., spring-boot-starter-validation) for these constraints to be enforced.


🛠️ Step 5: Use profile-specific files (application-{profile}.yml)

Spring Boot loads application.yml and then applies profile-specific overrides.

Example:

  • application.yml (defaults)
  • application-prod.yml (production overrides)
YAMLconfig.yml
# application-prod.yml
app:
  security:
    enabled: true
  allowed-origins:
    - 'https://mycompany.com'

When multiple profiles are active, profile files are applied with a “last wins” strategy (the last active profile can override earlier ones).


🌟 Tips

In this section, we clarify Tips and summarize the key points you will apply in implementation.

  • Prefer @ConfigurationProperties over scattered @Value for anything non-trivial.
  • Keep a single AppProperties root per bounded domain (security, mail, storage, etc.).
  • Add validation constraints for anything that must not be empty or must be within a safe range.

🏁 Conclusion

You now have a type-safe Spring Boot configuration layer with startup validation and profile-based overrides. As a next step, externalize environment-specific secrets and add configuration tests to catch regressions early.

JAVAAppProperties.java
import java.util.List;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "app")
public class AppProperties {

  private Security security = new Security();
  private List<String> allowedOrigins = List.of();

  public Security getSecurity() {
    return security;
  }

  public void setSecurity(Security security) {
    this.security = security;
  }

  public List<String> getAllowedOrigins() {
    return allowedOrigins;
  }

  public void setAllowedOrigins(List<String> allowedOrigins) {
    this.allowedOrigins = allowedOrigins;
  }

  public static class Security {
    private boolean enabled = true;
    private int tokenExpirySeconds = 3600;

    public boolean isEnabled() {
      return enabled;
    }

    public void setEnabled(boolean enabled) {
      this.enabled = enabled;
    }

    public int getTokenExpirySeconds() {
      return tokenExpirySeconds;
    }

    public void setTokenExpirySeconds(int tokenExpirySeconds) {
      this.tokenExpirySeconds = tokenExpirySeconds;
    }
  }
}
KOTLINAppProperties.kt
import org.springframework.boot.context.properties.ConfigurationProperties

@ConfigurationProperties(prefix = "app")
data class AppProperties(
  val security: Security = Security(),
  val allowedOrigins: List<String> = emptyList(),
) {
  data class Security(
    val enabled: Boolean = true,
    val tokenExpirySeconds: Int = 3600,
  )
}
JAVAAppProperties.java
import java.util.List;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;

@ConfigurationProperties(prefix = "app")
@Validated
public class AppProperties {

  @Valid
  private Security security = new Security();

  @NotEmpty
  private List<String> allowedOrigins = List.of();

  public Security getSecurity() { return security; }
  public void setSecurity(Security security) { this.security = security; }

  public List<String> getAllowedOrigins() { return allowedOrigins; }
  public void setAllowedOrigins(List<String> allowedOrigins) { this.allowedOrigins = allowedOrigins; }

  public static class Security {
    private boolean enabled = true;

    @Min(60)
    private int tokenExpirySeconds = 3600;

    public boolean isEnabled() { return enabled; }
    public void setEnabled(boolean enabled) { this.enabled = enabled; }

    public int getTokenExpirySeconds() { return tokenExpirySeconds; }
    public void setTokenExpirySeconds(int tokenExpirySeconds) { this.tokenExpirySeconds = tokenExpirySeconds; }
  }
}
KOTLINAppProperties.kt
import jakarta.validation.Valid
import jakarta.validation.constraints.Min
import jakarta.validation.constraints.NotEmpty
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.validation.annotation.Validated

@ConfigurationProperties(prefix = "app")
@Validated
data class AppProperties(
  @field:Valid
  val security: Security = Security(),

  @field:NotEmpty
  val allowedOrigins: List<String> = emptyList(),
) {
  data class Security(
    val enabled: Boolean = true,

    @field:Min(60)
    val tokenExpirySeconds: Int = 3600,
  )
}