← Назад к вопросам

Перезаписываются ли значения из файла свойств переменными окружения

2.2 Middle🔥 191 комментариев
#Spring Boot и Spring Data

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Перезаписываются ли значения из файла свойств переменными окружения

Ответ: ДА, но зависит от конкретного фреймворка и конфигурации.

В Spring Boot (самый популярный фреймворк в Java) переменные окружения имеют приоритет выше и перезаписывают значения из файла свойств.

Иерархия приоритета в Spring Boot

Spring Boot применяет данные из источников в следующем порядке от низшего к высшему приоритету:

  1. application.properties / application.yml (в classpath)
  2. application-{profile}.properties (profile-specific, например application-prod.properties)
  3. Переменные окружения (ОС) ← ПЕРЕЗАПИСЫВАЮТ файл свойств!
  4. Системные свойства JVM (-D флаги)
  5. Командная строка (--spring.property.name=value)
  6. Config Server (если используется Spring Cloud Config)

Пример

application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=root_password

Переменные окружения ОС:

export SPRING_DATASOURCE_URL=jdbc:postgresql://prod-server:5432/prod_db
export SPRING_DATASOURCE_USERNAME=prod_user

Результат:

// Перезаписано из переменных окружения
spring.datasource.url = "jdbc:postgresql://prod-server:5432/prod_db"
spring.datasource.username = "prod_user"

// Остаётся из файла
spring.datasource.password = "root_password"

Как работает маппинг переменных окружения

Spring использует convention-based преобразование:

application.properties:     spring.datasource.url
Переменная окружения:       SPRING_DATASOURCE_URL
                            (точки → подчёркивания, ЗАПИсь CAPS)

Примеры преобразований:

application.propertiesПеременная окруженияОписание
server.portSERVER_PORTпростое свойство
spring.datasource.urlSPRING_DATASOURCE_URLс точками
app.security.jwt.secretAPP_SECURITY_JWT_SECRETвложенные свойства
my-propertyMY_PROPERTYдефисы → подчёркивания
myPropertyMY_PROPERTYcamelCase → UPPER_SNAKE

Практический пример для разработки и production

development (application-dev.properties):

spring.datasource.url=jdbc:mysql://localhost:3306/dev_db
spring.jpa.hibernate.ddl-auto=create-drop
debug=true

production (application-prod.properties):

spring.datasource.url=jdbc:postgresql://localhost:5432/prod_db
spring.jpa.hibernate.ddl-auto=validate
debug=false

При запуске на продакшене:

# Переменные окружения ПЕРЕЗАПИСЫВАЮТ application-prod.properties
export SPRING_DATASOURCE_URL=jdbc:postgresql://prod-server.com:5432/db
export SPRING_DATASOURCE_USERNAME=prod_user
export SPRING_DATASOURCE_PASSWORD=super_secret_pass

java -Dspring.profiles.active=prod -jar app.jar

Как проверить приоритет в коде

@Component
public class ConfigDebugger {
    
    @Value("${spring.datasource.url}")
    private String dbUrl;
    
    @PostConstruct
    public void printConfig() {
        System.out.println("Database URL: " + dbUrl);
        // Это будет ПЕРЕПИСАННОЕ значение из переменной окружения!
    }
}

Отключение переписывания (если нужно)

Если ты хочешь, чтобы файл свойств не перезаписывался переменными окружения:

spring.config.import=file:classpath:application.properties
spring.config.override-system-properties=false

Однако это редко используется на продакшене.

Используй переменные окружения для

Секреты и токены:

export DATABASE_PASSWORD=secret123
export API_KEY=sk-xxxxxxx
export JWT_SECRET=very_secret_key

Различные окружения:

export SPRING_PROFILES_ACTIVE=prod
export APP_ENV=production

Масштабирование:

export SERVER_PORT=8081
export SPRING_DATASOURCE_HIKARI_MAXIMUM_POOL_SIZE=50

Docker/Kubernetes пример

# Dockerfile
FROM openjdk:11-jre-slim
COPY app.jar /app.jar
CMD ["java", "-jar", "/app.jar"]
# docker-compose.yml
services:
  app:
    image: myapp
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/db
      SPRING_DATASOURCE_USERNAME: postgres
      SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD}
      SPRING_PROFILES_ACTIVE: prod
# kubernetes deployment
spec:
  containers:
  - name: app
    env:
    - name: SPRING_DATASOURCE_URL
      value: jdbc:postgresql://postgres-service:5432/db
    - name: SPRING_DATASOURCE_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: password

Чеклист для конфигурации

  • Секреты (пароли, API ключи) → переменные окружения
  • Окружение (dev/prod) → spring.profiles.active
  • Файл свойств → значения по умолчанию
  • Переменные окружения → переопределяют файл (имеют приоритет)
  • Никогда не коммить .env файлы в git
  • Документировать все переменные окружения в README

Вывод

ДА, переменные окружения ПЕРЕЗАПИСЫВАЮТ файл свойств в Spring Boot. Это правильный способ работать с разными окружениями и хранить секреты.

Перезаписываются ли значения из файла свойств переменными окружения | PrepBro