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 .