Profiles & Environments

Managing different configurations for different environments

← Back to Index

What are Profiles?

Profiles allow you to have different configurations for different environments (dev, test, prod).

Profile-Specific Files

src/main/resources/
├── application.properties          # Default/shared config
├── application-dev.properties      # Development
├── application-test.properties     # Testing
└── application-prod.properties     # Production

Example Configurations

# application.properties (shared)
app.name=My Application
spring.jpa.show-sql=false

# application-dev.properties
spring.datasource.url=jdbc:h2:mem:devdb
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
logging.level.com.example=DEBUG

# application-prod.properties
spring.datasource.url=jdbc:postgresql://prod-db:5432/myapp
spring.jpa.hibernate.ddl-auto=validate
logging.level.root=WARN

Activating Profiles

# In application.properties
spring.profiles.active=dev

# Command line
java -jar app.jar --spring.profiles.active=prod

# Environment variable
export SPRING_PROFILES_ACTIVE=prod
java -jar app.jar

# Multiple profiles
java -jar app.jar --spring.profiles.active=prod,metrics

Profile-Specific Beans

@Configuration
public class DataSourceConfig {

    @Bean
    @Profile("dev")
    public DataSource devDataSource() {
        // H2 in-memory database for development
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .build();
    }

    @Bean
    @Profile("prod")
    public DataSource prodDataSource() {
        // Real database for production
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl("jdbc:postgresql://prod:5432/db");
        return ds;
    }

    @Bean
    @Profile("!prod")  // Any profile except prod
    public DataInitializer dataInitializer() {
        return new DataInitializer();
    }
}

// Profile on entire class
@Service
@Profile("dev")
public class MockEmailService implements EmailService {
    // Mock implementation for dev
}

@Service
@Profile("prod")
public class SmtpEmailService implements EmailService {
    // Real implementation for prod
}

YAML Multi-Document

# application.yml - all profiles in one file

# Default config
app:
  name: My Application

---
spring:
  config:
    activate:
      on-profile: dev

spring:
  datasource:
    url: jdbc:h2:mem:devdb

---
spring:
  config:
    activate:
      on-profile: prod

spring:
  datasource:
    url: jdbc:postgresql://prod:5432/db

Summary

  • Profiles: Environment-specific configuration
  • application-{profile}.properties: Profile-specific files
  • spring.profiles.active: Activate profiles
  • @Profile: Profile-specific beans
  • @Profile("!prod"): All except prod