Environment Variables in Spring Boot's Properties Files

Environment variables are a common way to configure applications across different environments (development, testing, production, etc.). Spring Boot provides multiple ways to use environment variables in its configuration files. In this tutorial, we'll explore how to use environment variables in Spring Boot's properties files.

Prerequisites

  • JDK 17 or later
  • Maven or Gradle
  • IDE (IntelliJ IDEA, Eclipse, etc.)

Step 1: Set Up a Spring Boot Project

1.1 Create a New Spring Boot Project

Use Spring Initializr to create a new project with the following dependencies:

  • Spring Web
  • Spring Boot Actuator

Download and unzip the project, then open it in your IDE.

Step 2: Configuring Properties Files with Environment Variables

Spring Boot allows you to reference environment variables in your application.properties or application.yml files using the ${...} syntax.

2.1 Using Environment Variables in application.properties

You can refer to environment variables in the application.properties file using the ${...} syntax. For example, if you want to configure your database connection using environment variables, you can do it as follows:

# application.properties

spring.datasource.url=${DB_URL}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
spring.datasource.driver-class-name=${DB_DRIVER:org.h2.Driver}

Explanation:

  • ${DB_URL}: Refers to the DB_URL environment variable.
  • ${DB_USERNAME}: Refers to the DB_USERNAME environment variable.
  • ${DB_PASSWORD}: Refers to the DB_PASSWORD environment variable.
  • ${DB_DRIVER:org.h2.Driver}: Refers to the DB_DRIVER environment variable and defaults to org.h2.Driver if the environment variable is not set.

2.2 Using Environment Variables in application.yml

Similarly, you can use environment variables in the application.yml file:

# application.yml

spring:
  datasource:
    url: ${DB_URL}
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
    driver-class-name: ${DB_DRIVER:org.h2.Driver}

2.3 Setting Environment Variables

2.3.1 Setting Environment Variables in the Shell

You can set environment variables in your shell before running the Spring Boot application:

export DB_URL=jdbc:mysql://localhost:3306/mydb
export DB_USERNAME=root
export DB_PASSWORD=secret
export DB_DRIVER=com.mysql.cj.jdbc.Driver

./mvnw spring-boot:run

2.3.2 Setting Environment Variables in an IDE

Most IDEs allow you to set environment variables for your application. For example, in IntelliJ IDEA:

  1. Open the Run/Debug Configurations dialog.
  2. Select your application.
  3. Add the environment variables in the Environment Variables field (e.g., DB_URL=jdbc:mysql://localhost:3306/mydb;DB_USERNAME=root;DB_PASSWORD=secret;DB_DRIVER=com.mysql.cj.jdbc.Driver).

2.4 Accessing Environment Variables Programmatically

You can also access environment variables programmatically in your Spring Boot application using the @Value annotation or the Environment abstraction.

2.4.1 Using @Value Annotation

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    @Value("${DB_URL}")
    private String dbUrl;

    @Value("${DB_USERNAME}")
    private String dbUsername;

    @Value("${DB_PASSWORD}")
    private String dbPassword;

    @Value("${DB_DRIVER:org.h2.Driver}")
    private String dbDriver;

    // Getters and other methods
}

2.4.2 Using Environment Abstraction

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    @Autowired
    private Environment env;

    public void printDatabaseConfig() {
        String dbUrl = env.getProperty("DB_URL");
        String dbUsername = env.getProperty("DB_USERNAME");
        String dbPassword = env.getProperty("DB_PASSWORD");
        String dbDriver = env.getProperty("DB_DRIVER", "org.h2.Driver");

        System.out.println("Database URL: " + dbUrl);
        System.out.println("Database Username: " + dbUsername);
        System.out.println("Database Password: " + dbPassword);
        System.out.println("Database Driver: " + dbDriver);
    }
}

Step 3: Example REST Controller

Create a REST controller to demonstrate the use of environment variables.

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConfigController {

    @Autowired
    private Environment env;

    @GetMapping("/config")
    public String getConfig() {
        String dbUrl = env.getProperty("DB_URL");
        String dbUsername = env.getProperty("DB_USERNAME");
        String dbPassword = env.getProperty("DB_PASSWORD");
        String dbDriver = env.getProperty("DB_DRIVER", "org.h2.Driver");

        return "Database URL: " + dbUrl + "\n"
                + "Database Username: " + dbUsername + "\n"
                + "Database Password: " + dbPassword + "\n"
                + "Database Driver: " + dbDriver;
    }
}

Step 4: Running the Application

4.1 Setting Environment Variables and Running

Set the environment variables in your shell and run the application:

export DB_URL=jdbc:mysql://localhost:3306/mydb
export DB_USERNAME=root
export DB_PASSWORD=secret
export DB_DRIVER=com.mysql.cj.jdbc.Driver

./mvnw spring-boot:run

4.2 Testing the Configuration

Open your browser and navigate to http://localhost:8080/config to see the configuration values retrieved from the environment variables.

Conclusion

In this tutorial, you have learned how to use environment variables in Spring Boot's properties files. This approach provides a flexible and secure way to configure your application across different environments. You also learned how to set environment variables in the shell and IDE, and how to access these variables programmatically in your Spring Boot application.


Comments