Spring Profiles & Configuration

SkillSecurity

Configuration and profiles management in Spring Boot 3.x. Covers @Profile, @ConfigurationProperties, property sources, YAML/properties, external configuration, secrets management, and environment-specific beans.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Spring Profiles & Configuration skill

What this skill tells your AI

The instructions your AI receives, as published by claude-dev-suite/claude-dev-suite in skills/backend-frameworks/spring-profiles/SKILL.md and read by ahel’s review.

Quick Start

@Configuration
@Profile("dev")
public class DevConfig {
    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .build();
    }
}

@Configuration
@Profile("prod")
public class ProdConfig {
    @Bean
    public DataSource dataSource() {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl(System.getenv("DATABASE_URL"));
        return ds;
    }
}

Profile Activation

# 1. application.yml
spring:
  profiles:
    active: dev

# 2. Environment variable: SPRING_PROFILES_ACTIVE=prod
# 3. Command line: java -jar app.jar --spring.profiles.active=prod
# 4. JVM property: java -Dspring.profiles.active=prod -jar app.jar

Profile Groups

spring:
  profiles:
    active: production
    group:
      production:
        - prod
        - prod-db
        - prod-security
      development:
        - dev
        - dev-db
        - dev-tools

Profile Expression

@Profile("cloud & kubernetes")  // AND
@Profile("dev | test")          // OR
@Profile("!prod")               // NOT
@Profile("(dev | test) & !integration")  // Combined

@ConfigurationProperties

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

    @NotBlank
    private String name;

    @NotNull
    private String version;

    private final Security security = new Security();

    @Validated
    public static class Security {
        @NotBlank
        private String jwtSecret;

        @Min(3600)
        private long jwtExpiration = 86400;

        @NotEmpty
        private List<String> allowedOrigins = new ArrayList<>();
    }

    // Getters and setters
}

// Abilitazione
@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class AppConfig {}
app:
  name: MyApplication
  version: 1.0.0
  security:
    jwt-secret: ${JWT_SECRET}
    jwt-expiration: 86400
    allowed-origins:
      - https://example.com

Immutable Configuration (Record)

@ConfigurationProperties(prefix = "app.mail")
public record MailProperties(
    @NotBlank String host,
    @Min(1) @Max(65535) int port,
    String username,
    @DefaultValue("false") boolean starttls
) {}

Full Reference: See properties.md for Property Sources, External Configuration (Config Server, K8s, Vault).


Conditional Beans

@Bean
@ConditionalOnProperty(name = "feature.email.enabled", havingValue = "true")
public EmailService emailService() {
    return new RealEmailService();
}

@Bean
@Profile("dev")
public CacheManager devCacheManager() {
    return new ConcurrentMapCacheManager();
}

@Bean
@ConditionalOnMissingBean(UserService.class)
public UserService defaultUserService() {
    return new DefaultUserService();
}

Full Reference: See conditional.md for Custom Conditions, Validation, Testing.


Secrets Management

spring:
  datasource:
    password: ${DB_PASSWORD}

app:
  security:
    jwt-secret: ${JWT_SECRET}

Full Reference: See secrets.md for Jasypt Encryption, Vault Integration.


Best Practices

DoDon't
Use @ConfigurationProperties for structured configUse @Value for complex config
Validate properties with Bean ValidationSkip validation
Use profile groups for complex environmentsDuplicate configuration
Externalize all secretsCommit secrets to repository
Use sensible default valuesRequire all properties

Production Checklist

  • Secrets externalized (env vars, Vault)
  • Profiles configured for each environment
  • Validation enabled on all properties
  • Default values for optional properties
  • Profile groups for related config
  • Configuration encrypted where needed

When NOT to Use This Skill

  • Runtime feature flags - Consider LaunchDarkly, Flipt
  • Centralized config - Use spring-cloud-config skill
  • Secrets only - Consider HashiCorp Vault directly

Anti-Patterns

Anti-PatternProblemSolution
Secrets in gitSecurity vulnerabilityUse env vars or secrets manager
Wrong prefixProperties not loadedVerify prefix matches YAML
Missing @ValidatedValidation ignoredAdd @Validated annotation
@Value for complex configUnmaintainableUse @ConfigurationProperties

Quick Troubleshooting

ProblemDiagnosticFix
Properties not loadedCheck prefixVerify @ConfigurationProperties prefix
Profile not activeCheck logs at startupSet spring.profiles.active
Binding failedCheck typeUse correct types (Duration, etc.)
Env var not resolvedCheck namingUse UPPER_SNAKE_CASE

Reference Files

FileContent
properties.mdProperty Sources, External Configuration
conditional.mdConditional Beans, Validation, Testing
secrets.mdSecrets Management, Encryption

External Documentation

Signals

GitHub stars
33
Forks
6
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
spring-profiles
Source
github.com/claude-dev-suite/claude-dev-suite