Как работать с Property из application.properties как с бином
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Работа с 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-name→userNameAPP_USER_NAME→userNameapp.userName→userName
Все эти форматы будут работать с одним и тем же полем.
Ключевые преимущества
- Типизация — свойства преобразуются в нужные типы
- Валидация — встроенная поддержка JSR-303
- Структурированность — сложные конфигурации читаются очень хорошо
- Переиспользование — один класс конфига можно инжектировать везде
- Тестирование — легко мокировать конфиги в тестах