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