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 roles = new ArrayList<>(Collections.singleton("USER"));

        public String getUsername() { ... }

        public void setUsername(String username) { ... }

        public String getPassword() { ... }

        public void setPassword(String password) { ... }

        public List getRoles() { ... }

        public void setRoles(List roles) { ... }

    }
}

Предыдущий 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, и привязка к статическим свойствам не поддерживается.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки