Как ввести значение свойства в класс, не управляемый Spring?

1. Обзор

По замыслу, классы, помеченные @ Repository, @Service, @Controller и т. Д., Управляются Spring, и внедрение конфигурации происходит просто и естественно. Что не так просто, так это передача конфигурации классам, которые не управляются непосредственно Spring.

В этом случае мы можем использовать загрузку конфигурации на основе _ClassLoader - или просто создать экземпляры наших классов в другом компоненте и установить необходимые параметры вручную - это рекомендуемый вариант, поскольку записи конфигурации не нужно хранить исключительно в файлах ** . Properties_ .

В этой быстрой статье мы расскажем о загрузке файлов ** . Properties с помощью Java ClassLoader , а также о вставке уже ссылки:/properties-with-spring[загруженная конфигурация Spring]в неуправляемый класс.

2. Загрузка конфигурации с помощью Class Loader

Проще говоря, ** . Properties файлы - это файлы ресурсов, содержащие некоторую информацию о конфигурации. Вместо использования сторонних реализаций, которые поддерживают автоматическую загрузку конфигурации приложения, например который реализован в Spring, мы можем использовать Java ClassLoader , чтобы сделать то же самое.

Мы собираемся создать контейнерный объект, который будет содержать Properties , определенный в resourceFileName . Чтобы заполнить контейнер конфигурацией, мы будем использовать ClassLoader .

Давайте определим класс PropertiesLoader , который реализует метод loadProperties (String resourceFileName) :

public class PropertiesLoader {

    public static Properties loadProperties(String resourceFileName) throws IOException {
        Properties configuration = new Properties();
        InputStream inputStream = PropertiesLoader.class
          .getClassLoader()
          .getResourceAsStream(resourceFileName);
        configuration.load(inputStream);
        inputStream.close();
        return configuration;
    }
}

Каждый объект Class содержит ссылку на ClassLoader , который его создал; это объект, который в основном отвечает за загрузку классов, но в этом руководстве мы будем использовать его для загрузки файла ресурсов вместо простого класса Java. ClassLoader ищет resourceFileName на пути к классам.

После этого мы загружаем файл ресурсов как InputStream через API getResourceAsStream .

В приведенном выше примере мы определили контейнер конфигурации, который может анализировать resourceFileName с помощью API load (InputStream) .

Метод load реализует синтаксический анализ файлов ** . Properties с поддержкой символов «:» или «=» в качестве разделителей. Кроме того, символы «#» или «!» , Используемые в начале новой строки, являются маркерами комментариев и приводят к игнорированию этой строки.

Наконец, давайте прочитаем точное значение определенной записи конфигурации из наших файлов конфигурации:

String property = configuration.getProperty(key);

3. Загрузка конфигурации с помощью Spring

Второе решение - использовать функцию Spring Spring для обработки некоторых низкоуровневых загрузок и обработки файлов.

Давайте определим Initializer , который будет содержать конфигурацию, необходимую для инициализации нашего пользовательского класса. Во время инициализации Bean платформа загрузит все поля, помеченные @ Value из файла конфигурации ** . Properties :

@Component
public class Initializer {

    private String someInitialValue;
    private String anotherManagedValue;

    public Initializer(
      @Value("someInitialValue") String someInitialValue,
      @Value("anotherValue") String anotherManagedValue) {

        this.someInitialValue = someInitialValue;
        this.anotherManagedValue = anotherManagedValue;
    }

    public ClassNotManagedBySpring initClass() {
        return new ClassNotManagedBySpring(
          this.someInitialValue, this.anotherManagedValue);
    }
}

Initializer теперь может отвечать за создание экземпляра ClassNotManagedBySpring.

Теперь мы просто перейдем к нашему экземпляру Initializer и запустим на нем метод initClass () , чтобы обработать создание нашего пользовательского ClassNotManagedBySpring :

ClassNotManagedBySpring classNotManagedBySpring = initializer.initClass();

Получив ссылку на Initializer , мы сможем создать экземпляр нашего собственного ClassNotManagedBySpring.

4. Резюме

В этом кратком руководстве мы сосредоточились на чтении свойств в не-Spring Java-класс.

Как всегда, пример реализации можно найти по адресу over на GitHub .