25 Profiles

Profile in Spring Boot bieten eine Möglichkeit, unterschiedliche Konfigurationen für verschiedene Umgebungen zu definieren. Dies ist besonders nützlich, wenn Anwendungen in verschiedenen Stufen wie Entwicklung, Test und Produktion eingesetzt werden. Durch die Verwendung von Profilen können Konfigurationen dynamisch je nach der Umgebung, in der die Anwendung läuft, angepasst werden. Dies hilft, Flexibilität zu gewährleisten und ermöglicht eine klarere Trennung von Konfigurationen und Umgebungsabhängigkeiten.

25.1 Grundlagen der Profile

Spring Boot unterstützt das Konzept von Umgebungsprofilen, mit denen Sie verschiedene Einstellungen und Konfigurationen je nach Umgebung definieren können. Zum Beispiel können Sie ein Profil für die Entwicklung (dev), eines für die Tests (test) und eines für die Produktion (prod) anlegen. Jedes Profil kann spezifische Eigenschaften wie Datenbankkonfiguration, Logging-Level oder Sicherheitsparameter definieren.

25.1.1 Aktivieren eines Profils

Um ein Profil zu aktivieren, kann das Attribut spring.profiles.active entweder in der Kommandozeile, in der application.properties oder in der application.yml Datei gesetzt werden:

Kommandozeilenargument:

java -jar myapp.jar --spring.profiles.active=dev

In der application.properties:

spring.profiles.active=dev

In der application.yml:

spring:
  profiles:
    active: dev

Durch diese Einstellungen wird das Profil dev aktiviert und die zugehörigen Konfigurationen angewendet.

25.2 Anlegen von Profil-spezifischen Konfigurationsdateien

Eine übliche Praxis ist das Erstellen von separaten Konfigurationsdateien für jedes Profil. Diese Dateien haben die Struktur application-{profile}.properties oder application-{profile}.yml. Wenn ein Profil aktiviert wird, zieht Spring Boot die entsprechende Konfigurationsdatei heran.

Beispiel: application-dev.properties

server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/dev_db
spring.datasource.username=dev_user
spring.datasource.password=dev_password

Beispiel: application-prod.properties

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/prod_db
spring.datasource.username=prod_user
spring.datasource.password=prod_password
logging.level.org.springframework=INFO

Wenn das dev-Profil aktiv ist, wird die Datenbankkonfiguration aus application-dev.properties geladen, andernfalls die aus application-prod.properties.

25.3 Verwendung von @Profile in Spring Beans

Mit der Annotation @Profile können Sie steuern, welche Beans je nach aktivem Profil instanziiert werden sollen. Dies ermöglicht es, spezifische Implementierungen für verschiedene Umgebungen zu definieren.

Beispiel:

@Configuration
public class DataSourceConfig {

    @Bean
    @Profile("dev")
    public DataSource devDataSource() {
        return new DataSourceBuilder()
                .url("jdbc:mysql://localhost:3306/dev_db")
                .username("dev_user")
                .password("dev_password")
                .build();
    }

    @Bean
    @Profile("prod")
    public DataSource prodDataSource() {
        return new DataSourceBuilder()
                .url("jdbc:mysql://localhost:3306/prod_db")
                .username("prod_user")
                .password("prod_password")
                .build();
    }
}

In diesem Beispiel wird bei aktiviertem dev-Profil eine Entwicklungsdatenbank verwendet, während bei aktiviertem prod-Profil die Produktionsdatenbank konfiguriert wird.

25.4 Profile kombinieren

Spring Boot erlaubt es, mehrere Profile gleichzeitig zu aktivieren. Dies kann hilfreich sein, wenn Sie zum Beispiel sowohl ein generisches “test”-Profil als auch ein spezifischeres “staging”-Profil verwenden wollen. Mehrere Profile können durch Komma getrennt angegeben werden.

Beispiel:

spring.profiles.active=test,staging

In diesem Fall werden beide Profile aktiviert, und Spring Boot wird die Konfigurationen aus application-test.properties und application-staging.properties laden.

25.5 Fallback und Default-Profil

Spring Boot aktiviert standardmäßig das default-Profil, wenn kein anderes Profil definiert ist. Es wird empfohlen, allgemeine Konfigurationen in der Datei application.properties oder application.yml zu definieren, die von allen Profilen verwendet werden sollen.

Beispiel: application.properties

server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

Diese Einstellungen werden für alle Profile verwendet, es sei denn, eine profil-spezifische Datei überschreibt sie.

25.6 Best Practices

  1. Profile für Umgebungswechsel nutzen: Vermeiden Sie es, hartkodierte Umgebungsdaten (z.B. Datenbank-URLs oder Benutzernamen) in Ihrem Code zu verwenden. Nutzen Sie stattdessen Profile, um Umgebungsabhängigkeiten klar zu trennen.

  2. Klar benannte Profile: Verwenden Sie beschreibende Profilnamen, wie dev, test, staging, und prod, um die Übersicht zu wahren.

  3. Profile sinnvoll kombinieren: Wenn bestimmte Konfigurationen in mehreren Umgebungen gleich sind, kombinieren Sie Profile (z.B. spring.profiles.active=prod,logging), um Redundanz zu vermeiden.

  4. Vermeiden Sie Profile für Geheimnisse: Nutzen Sie Profile nicht, um sensible Daten wie Passwörter oder API-Schlüssel zu verwalten. Verwenden Sie dafür spezialisierte Werkzeuge wie Spring Cloud Config oder Vault.

25.7 Beispielanwendung mit Profilen

Hier ist ein komplettes Beispiel für eine Anwendung, die Profile verwendet, um Datenbankkonfigurationen für die Entwicklungs- und Produktionsumgebung zu steuern:

application.properties (Allgemeine Konfiguration):

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

application-dev.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/dev_db
spring.datasource.username=dev_user
spring.datasource.password=dev_password

application-prod.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/prod_db
spring.datasource.username=prod_user
spring.datasource.password=prod_password

Java-Konfiguration mit @Profile:

@Configuration
public class AppConfig {

    @Bean
    @Profile("dev")
    public DataSource devDataSource() {
        return DataSourceBuilder.create()
            .url("jdbc:mysql://localhost:3306/dev_db")
            .username("dev_user")
            .password("dev_password")
            .build();
    }

    @Bean
    @Profile("prod")
    public DataSource prodDataSource() {
        return DataSourceBuilder.create()
            .url("jdbc:mysql://localhost:3306/prod_db")
            .username("prod_user")
            .password("prod_password")
            .build();
    }
}

Durch die Aktivierung des entsprechenden Profils, entweder dev oder prod, wird die jeweilige Datenbank verwendet.

25.8 tl;dr

Spring Boot-Profile sind eine leistungsstarke Funktion, um Konfigurationen für verschiedene Umgebungen zu verwalten. Sie ermöglichen eine saubere Trennung von Entwicklungs-, Test- und Produktionskonfigurationen und bieten Flexibilität beim Einsatz von Umgebungsvariablen. Richtig eingesetzt, können Profile den Deployment-Prozess deutlich vereinfachen und eine klare Trennung von Zuständigkeiten schaffen.