Spring Boot: проверка типов свойств конфигурации, связывание свойств JavaBean
Использование аннотации @Value("${property}") для добавления свойств конфигурации иногда может быть затруднительным, особенно если вы работаете с несколькими свойствами или ваши данные имеют иерархическую природу. Spring Boot предоставляет альтернативный метод работы со свойствами, который позволяет строго типизированным bean-компонентам управлять и проверять конфигурацию вашего приложения.
Связывание свойств JavaBean
Можно связать компонент, объявляющий стандартные свойства JavaBean, как показано в следующем примере:
package com.example;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("acme")
public class AcmeProperties {
private boolean enabled;
private InetAddress remoteAddress;
private final Security security = new Security();
public boolean isEnabled() { ... }
public void setEnabled(boolean enabled) { ... }
public InetAddress getRemoteAddress() { ... }
public void setRemoteAddress(InetAddress remoteAddress) { ... }
public Security getSecurity() { ... }
public static class Security {
private String username;
private String password;
private List
Предыдущий POJO определяет следующие свойства:
- acme.enabled, со значением false по умолчанию.
- acme.remote-address, с типом, который может быть приведен из String.
- acme.security.username с вложенным объектом "security", имя которого определяется именем свойства. В частности, тип возврата там вообще не используется и может быть SecurityProperties.
- acme.security.password.
- acme.security.roles, с набором String, который по умолчанию равен USER.
Свойства, которые сопоставляются с классами @ConfigurationProperties, доступными в Spring Boot, которые настраиваются с помощью файлов свойств, файлов YAML, переменных среды и т. д., являются общедоступным API, но средства доступа (getters/setters) самого класса не предназначены для непосредственного использования.
Такое расположение опирается на пустой конструктор по умолчанию, getters и setters обычно являются обязательными, поскольку привязка осуществляется через стандартные дескрипторы свойств Java Beans, как в Spring MVC. Setter может быть опущен в следующих случаях:
- Карты, пока они инициализируются, нуждаются в getter, но не обязательно в setter, так как они могут быть изменены связывателем.
- Доступ к коллекциям и массивам можно получить либо через индекс (обычно с YAML), либо с помощью одного значения (свойств), разделенных запятыми. В последнем случае, setter является обязательным. Рекомендуется всегда добавлять setter для таких типов. Если вы инициализируете коллекцию, убедитесь, что она не является неизменной (как в предыдущем примере).
- Если вложенные свойства POJO инициализируются (как поле Security в предыдущем примере), setter не требуется. Если вы хотите, чтобы механизм связывания создал экземпляр на лету, используя его конструктор по умолчанию, вам нужен setter.
Некоторые люди используют Project Lombok для автоматического добавления getters и setters. Убедитесь, что Lombok не генерирует какой-либо конкретный конструктор для такого типа, так как он автоматически используется контейнером для создания экземпляра объекта.
Наконец, рассматриваются только стандартные свойства Java Bean, и привязка к статическим свойствам не поддерживается.
Читайте также:
- Spring Boot: внешняя конфигурация
- Spring Boot: конфигурация, файлы свойств приложения
- Spring Boot: конфигурация, использование YAML вместо свойств
Комментарии
Отправить комментарий