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

Как работать с Property из application.properties как с бином

1.0 Junior🔥 181 комментариев
#Spring Boot и Spring Data

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

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

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

Работа с Properties как с Spring Bean

Spring Boot предоставляет мощный механизм для преобразования значений из application.properties в типизированные Java-объекты (бины). Это называется Configuration Properties Binding.

Основной подход: @ConfigurationProperties

Для работы с группой связанных свойств используется аннотация @ConfigurationProperties:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    private String name;
    private int port;
    private String database;
    
    // Getters и Setters обязательны!
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getPort() {
        return port;
    }
    
    public void setPort(int port) {
        this.port = port;
    }
    
    public String getDatabase() {
        return database;
    }
    
    public void setDatabase(String database) {
        this.database = database;
    }
}

В application.properties:

app.name=MyApplication
app.port=8080
app.database=postgresql

Основные моменты:

  • Префикс app. в application.properties соответствует полю класса
  • Необходимы Getters/Setters для каждого поля
  • Spring автоматически создаёт бин и инжектирует значения
  • Тип преобразования происходит автоматически (String → int)

Вложенные свойства (Nested Properties)

Для более сложных структур используются вложенные классы:

@Component
@ConfigurationProperties(prefix = "server")
public class ServerProperties {
    private String host;
    private int port;
    private Ssl ssl = new Ssl();
    
    public static class Ssl {
        private boolean enabled;
        private String keyStore;
        private String keyStorePassword;
        
        // Getters/Setters
        public boolean isEnabled() { return enabled; }
        public void setEnabled(boolean enabled) { this.enabled = enabled; }
        public String getKeyStore() { return keyStore; }
        public void setKeyStore(String keyStore) { this.keyStore = keyStore; }
        public String getKeyStorePassword() { return keyStorePassword; }
        public void setKeyStorePassword(String keyStorePassword) { 
            this.keyStorePassword = keyStorePassword; 
        }
    }
    
    public String getHost() { return host; }
    public void setHost(String host) { this.host = host; }
    public int getPort() { return port; }
    public void setPort(int port) { this.port = port; }
    public Ssl getSsl() { return ssl; }
    public void setSsl(Ssl ssl) { this.ssl = ssl; }
}

В application.properties:

server.host=localhost
server.port=8080
server.ssl.enabled=true
server.ssl.keyStore=classpath:keystore.jks
server.ssl.keyStorePassword=secret

Коллекции (Lists/Maps)

Spring поддерживает binding коллекций:

@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    private List<String> allowedHosts;
    private Map<String, Integer> weights;
    
    public List<String> getAllowedHosts() { return allowedHosts; }
    public void setAllowedHosts(List<String> allowedHosts) { 
        this.allowedHosts = allowedHosts; 
    }
    public Map<String, Integer> getWeights() { return weights; }
    public void setWeights(Map<String, Integer> weights) { 
        this.weights = weights; 
    }
}

Синтаксис в application.properties:

app.allowedHosts[0]=localhost
app.allowedHosts[1]=example.com
app.allowedHosts[2]=api.example.com

app.weights.service1=10
app.weights.service2=20
app.weights.service3=30

Или в YAML формате (более читаемо):

app:
  allowedHosts:
    - localhost
    - example.com
    - api.example.com
  weights:
    service1: 10
    service2: 20
    service3: 30

Использование в других компонентах

После того как Spring создал бин, его можно инжектировать обычным способом:

@Service
public class MyService {
    private final AppConfig config;
    
    public MyService(AppConfig config) {
        this.config = config;
    }
    
    public void initialize() {
        System.out.println("App name: " + config.getName());
        System.out.println("Port: " + config.getPort());
    }
}

Валидация свойств

Можно добавить валидацию через JSR-303 аннотации:

@Component
@ConfigurationProperties(prefix = "app")
@Validated
public class AppConfig {
    @NotBlank
    private String name;
    
    @Positive
    private int port;
    
    @Pattern(regexp = "^(mysql|postgresql|mongodb)$")
    private String database;
    
    // Getters/Setters
}

Валидация происходит при создании бина, если данные некорректны — выбросится ConfigurationPropertiesBindException.

@ConfigurationPropertiesScan (для явной регистрации)

Если не используется @Component, можно явно зарегистрировать класс конфига:

@SpringBootApplication
@ConfigurationPropertiesScan("com.example.config")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    // без @Component
}

Релаксированное связывание (Relaxed Binding)

Spring поддерживает гибкое связывание формата свойств:

  • app.user-nameuserName
  • APP_USER_NAMEuserName
  • app.userNameuserName

Все эти форматы будут работать с одним и тем же полем.

Ключевые преимущества

  1. Типизация — свойства преобразуются в нужные типы
  2. Валидация — встроенная поддержка JSR-303
  3. Структурированность — сложные конфигурации читаются очень хорошо
  4. Переиспользование — один класс конфига можно инжектировать везде
  5. Тестирование — легко мокировать конфиги в тестах