Как получить данные из файла property
Я хочу получить доступ к значениям, указанным в application.properties , например:
Я хочу получить доступ к userBucket.path в моей основной программе в приложении Spring Boot.
21 ответ
Вы можете использовать аннотацию @Value и получить доступ к свойству в любом используемом вами компоненте Spring.
Раздел Внешняя конфигурация загрузки Spring docs, объясняет все детали, которые могут вам понадобиться.
Чтобы выбрать значения из файла свойств, у нас может быть класс чтения конфигурации, например ApplicationConfigReader.class. Затем определить все переменные по свойствам. См. Ниже пример,
Ниже приведен соответствующий класс читателя.
Теперь мы можем автоматически подключать класс считывателя везде, где мы хотим получить доступ к значениям свойств. например
Вы можете использовать @ConfigurationProperties, это просто и легко получить доступ к значению, определенному в application.properties
У меня тоже была эта пробема. Но есть очень простое решение. Просто объявите свою переменную в конструкторе.
application.properties:
Класс Session ServiceImpl:
Этот подход не использует аннотацию загрузки Spring. Традиционный способ обучения.
Используйте метод getProperty () для передачи ключа и доступа к значению в файле свойств.
Есть 2 способа получить доступ к значению из файла application.properties
- Использование аннотации @Value
- Использование экземпляра класса среды
Вы также можете ввести экземпляр среды с помощью инъекции конструктора или самостоятельно создать bean-компонент
- вы можете напрямую использовать @Value в своем классе
- Чтобы сделать его чистым, вы можете очистить класс @Configuration , куда вы можете добавить все свои @value
Лучше всего использовать аннотацию @Value , она автоматически присвоит значение вашему объекту private Environment en . Это уменьшит размер кода и упростит фильтрацию файлов.
Наилучшие способы получения значений свойств используются.
1. Использование аннотации значений
2. Использование компонента Environment
Для меня ничего из вышеперечисленного не помогло мне напрямую. Я сделал следующее:
В дополнение к ответу @Rodrigo Villalba Zayas я добавил
implements InitializingBean в класс
и реализовал метод
Так это будет выглядеть
Вы можете использовать аннотацию @Value для чтения значений из файла application.properties/yml.
Вы можете использовать @Value("$") из application.properties, если ваш класс аннотирован @Configuration или @Component .
Есть еще один способ, который я опробовал, - это создать класс Utility для чтения свойств следующим образом:
Вы можете использовать статический метод, чтобы получить значение ключа, переданного в качестве параметра.
Spring-boot позволяет нам несколькими способами предоставлять внешние конфигурации, вы можете попробовать использовать файлы application.yml или yaml вместо файла свойств и предоставить различные настройки файлов свойств в соответствии с различными средами.
Мы можем разделить свойства для каждой среды в отдельные файлы yml в отдельных профилях Spring. Затем во время развертывания вы можете использовать:
Чтобы указать, какой профиль пружины использовать. Обратите внимание, что имена файлов yml должны быть такими, как
Для их автоматического захвата пружинным ботинком.
Чтобы прочитать из application.yml или файла свойств:
Самый простой способ прочитать значение из файла свойств или yml - использовать аннотацию spring @value. Spring автоматически загружает все значения из yml в среду Spring, поэтому мы можем напрямую использовать эти значения из окружающая среда как:
Или другой метод, который Spring предоставляет для чтения строго типизированных bean-компонентов, выглядит следующим образом:
Соответствующий POJO для чтения yml:
Вышеупомянутый метод хорошо работает с файлами yml.
Приложение может считывать 3 типа значений из файла application.properties.
Файл класса
Если у вас нет свойства в application.properties, вы можете использовать значение по умолчанию
Следуй этим шагам. 1: - создайте свой класс конфигурации, как показано ниже.
2: - когда у вас есть класс конфигурации, введите переменную из нужной конфигурации.
Вы можете использовать @Value для загрузки переменных из application.properties , если вы будете использовать это значение в одном месте, но если вам нужен более централизованный способ загрузки этих переменных, @ConfigurationProperties - лучший подход .
Кроме того, вы можете загружать переменные и автоматически преобразовывать их, если вам нужны разные типы данных для выполнения вашей проверки и бизнес-логики.
В настоящее время я знаю о следующих трех способах:
1. Аннотация @Value
- По моему опыту, бывают ситуации, когда вы не может получить значение или установлено на null . Например, когда вы пытаетесь установить его в методе preConstruct() или init() . Это происходит потому, что внедрение значения происходит после того, как класс полностью построен. Поэтому лучше использовать третий вариант.
2. Аннотация @PropertySource
- PropertySouce устанавливает значения из исходного файла свойств в переменной Environment (в вашем классе), когда класс загружается. Таким образом, вы можете легко получить послесловие.
- Доступно через переменную системной среды.
3. Аннотация @ConfigurationProperties .
-
Это в основном используется в проектах Spring для загрузки свойств конфигурации.
Он инициализирует сущность на основе данных о свойствах.
- @ConfigurationProperties указывает файл свойств для загрузки.
- @Configuration создает компонент на основе переменных файла конфигурации.
Вы тоже можете это сделать .
Затем, где бы вы ни хотели читать из application.properties, просто передайте ключ методу getConfigValue.
@ConfigurationProperties может использоваться для отображения значений из .properties ( .yml также поддерживается) в POJO.
Рассмотрим следующий пример файла.
Теперь к значению свойств можно получить доступ путем автоматического подключения employeeProperties следующим образом.
В наше время почти в каждом проекте используются различные статические файлы и данные, необходимые классам для безопасного и быстрого доступа. Примером таких конфигурационных файлов являются так называемые Файлы свойств, более известные как *.properties.
Каждый параметр сохраняется парой двух переменных строчной типа, одна сохраняет имя параметра (так называемый ключ), а другой сохраняет значение. Каждая строка файла .properties, как правило, хранит значения одного параметра. Несколько форматов являются допустимыми для .properties, в том числе ключ = значение, ключ: значение и сам ключ.
Например работы с .properties в Java
Для начала подготовим среду для работы и создадим проект (Рисунок 1):
Теперь посмотрим на структуру созданного проекта (Рисунок 2):
Как видим, в папке Resources уже есть файл под названием config.properties. Вам нужно будет его создать вручную и наполнить данными, а именно (Рисунки 3-4):
Далее прописываем необходимые ключи и значения, как на рисунке 5:
Пример обращения к файлу properties
Ниже представлена программа, демонстрирующая обращение к нашему конфигурационному файлу:
Большинству программ Java в какой-то момент необходимо использовать свойства, как правило, для хранения простых параметров в виде пар ключ-значение вне скомпилированного кода.
В этой статье я покажу использование базового класса Properties, в том числе способы загрузки и сохранения в формате XML, как управлять парами ключ-значение в объекте свойств, например извлекать значения, обновлять, получить его размер и как использовать список по умолчанию для объекта.
- Properties является подклассом Hashtable. Он используется для ведения списков значений, в которых ключ является строкой, а значение также является строкой.
- Класс Properties используется многими другими классами Java. Например, это тип объекта, возвращаемый System.getProperties() при получении значений.
- Одна полезная возможность класса состоит в том, что вы можете указать свойство по умолчанию, которое будет возвращаться, если никакое значение не связано с определенным ключом.
- Несколько потоков могут совместно использовать один объект без необходимости внешней синхронизации.
- Properties определяет переменную экземпляра.
- Properties() создает объект Properties, который не имеет значений по умолчанию.
- Properties (Properties propDefault): второй создает объект, который использует propDefault в качестве значения по умолчанию.
Начнем с примера загрузки пар ключ-значение из файлов свойств; мы загружаем два файла, которые мы имеем в нашем classpath:
Теперь мы можем очень просто загрузить их в экземпляр Properties:
Если содержимое файла соответствует требованиям формата файла свойств, оно может быть правильно проанализировано классом Properties.
Загрузка из файлов XML
Помимо файлов, класс Properties также может загружать файлы XML, которые соответствуют определенным спецификациям DTD.
Теперь давайте загрузим:
Как получить свойства?
Мы можем использовать getProperty (ключ String) и getProperty (ключ String, String defaultValue), чтобы получить значение по его ключу.
Если пара ключ-значение существует, оба метода будут возвращать соответствующее значение. Но если такой пары ключ-значение не существует, первая вернет null, а вторая вместо нее вернет defaultValue.
Обратите внимание, что хотя класс Properties наследует метод get() от класса Hashtable, я не рекомендую использовать его для получения значения. Поскольку его метод get() будет возвращать значение Object, которое может быть приведено только к String, а метод getProperty() уже обрабатывает значение Object правильно.
Код ниже выдаст исключение:
float appVerFloat = (float) appProps.get("version");Как установить свойства
Мы можем использовать метод setProperty(), чтобы обновить существующую пару ключ-значение или добавить новую.
Класс Properties наследует метод put() и метод putAll() от класса Hashtable, я не рекомендую использовать их по той же причине, что и для метода get(): в свойствах могут использоваться только строковые значения.
Приведенный ниже код не будет работать так, как вы хотите, когда вы используете getProperty() для получения его значения, он вернет null:
appProps.put("version", 2);Удалить свойства
Если вы хотите удалить пару ключ-значение, вы можете использовать метод remove().
Хранение Properties
Класс Properties предоставляет метод store() для вывода пар ключ-значение.
Второй параметр используется для комментариев. Если вы не хотите писать какой-либо комментарий, просто используйте для него значение null.
Хранение в XML-файлах
Класс Properties также предоставляет метод storeToXML() для вывода пар ключ-значение в формате XML.
Второй параметр такой же, как и в методе store().
Объект Properties может содержать другой объект Properties в качестве списка свойств по умолчанию. Список свойств по умолчанию будет найден, если ключ свойства не найден в исходном.
По умолчанию файлы свойств должны быть в кодировке ISO-8859-1 (Latin-1), поэтому обычно не следует использовать свойства с символами не из ISO-8859-1.
Мы можем обойти это ограничение с помощью таких инструментов, как JDK native2ascii или явное кодирование файлов, если это необходимо. Для файлов XML метод loadFromXML() и метод storeToXML() по умолчанию используют кодировку UTF-8.
Полный исходный код проекта доступен на GitHub
Средняя оценка / 5. Количество голосов:
Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.
В Java принято делать программы гибкими и легко настраиваемыми. Иногда еще говорят легко конфигурируемыми (от конфигурация).
Например, твоя программа раз в час копирует файлы из некоторой директории, архивирует их и отсылает тебе на email. Для этого программе надо знать директорию, откуда брать файлы и email, куда их посылать. Такие данные принято хранить не в коде программы, а в отдельных файлах свойств – properties-файлах.
Данные в таком файле хранятся в виде пар ключ-значение, разделенные знаком равно.
Слева от знака равно – имя (ключ), справа – значение.
Для удобной работы с такими файлами в Java есть специальный класс – Properties. Класс Properties унаследован от Hashtable<Object,Object>. Его даже можно рассматривать как HashTable, который умеет загружать себя из файла.
Метод Описание void load(Reader reader) Загружает свойства из файла, представленного объектом Reader void load(InputStream inStream) Загружает свойства из файла, представленного объектом InputStream void loadFromXML(InputStream in) Загружает свойства из XML-файла Object get(Object key) Возвращает значение по ключу. Метод унаследован от HashTable String getProperty(String key) Возвращает значение свойства (строку) по ключу String getProperty(String key, String defaultValue) Возвращает значение свойства по ключу или defaultValue, если такого ключа нет Set<String> stringPropertyNames() Возвращает список всех ключей Т.е. фактически тебе нужно выполнить всего две операции – загрузить в объект Properties данные из какого-нибудь файла, а затем получить эти свойства с помощью метода getProperty(). Ну и не забывай, что можешь пользоваться объектом Properties как HashMap.
Вот тебе пример:
Я хочу получить доступ к значениям, указанным application.properties , например:
Я хочу получить доступ userBucket.path к моей основной программе в приложении Spring Boot.
Вы можете использовать @Value аннотацию и получить доступ к свойству в любом компоненте Spring, который вы используете
В разделе « Внешняя конфигурация » документации Spring Boot объясняются все детали, которые могут вам понадобиться.
в качестве альтернативы можно получить их также весной Environment или через @ConfigurationProperties Что если вам нужно получить доступ к более чем 10 значениям, вам придется повторять свой пример 10 раз? Обратите внимание, что это работает только на @Component (или любой из его производных @Repository , т.Другой способ - это инъекция org.springframework.core.env.Environment в ваш боб.
Что делать, если вы хотите искать свойства? И могу ли я предложить включить оператор import, чтобы все могли видеть имя пакета Environment, возможно, org.springframework.core.env.Environment Будьте осторожны, чтобы не импортировать неправильную среду. Я автоматически импортировал среду CORBA. У @JanacMeena была та же проблема с org.springframework.core.env.Environment@ConfigurationProperties может использоваться для отображения значений из .properties ( .yml также поддерживаемых) в POJO.
Рассмотрим следующий пример файла.
.properties
Employee.java
Теперь к значению свойств можно получить доступ с помощью автоматического подключения employeeProperties следующим образом.
Я использовал этот способ и получил нулевой возврат, я поместил свой файл свойств в java-класс src / test / resources и properties (в котором сохраняется значение свойств) в src / main / package / properties. что я пропустил? спасибо Вы должны сохранить файлы, src/main/resources если вы не тестируете свой код из теста Spring. То же, что @AhmadLeoYudanto, и я ничего не могу сделать, чтобы это изменитьВ настоящее время я знаю о следующих трех способах:
1. @Value Аннотация
- По моему опыту, есть ситуации, когда вы не можете получить значение или оно установлено на null . Например, когда вы пытаетесь установить его в preConstruct() метод или init() метод. Это происходит потому, что внедрение значения происходит после того, как класс полностью построен. Вот почему лучше использовать 3-й вариант.
2. @PropertySource Аннотация
- PropertySouce устанавливает значения из исходного файла свойств в Environment переменную (в вашем классе), когда класс загружается. Таким образом, вы можете легко получить послесловие.
- Доступно через переменную System Environment.
3. @ConfigurationProperties Аннотация.
-
В основном это используется в проектах Spring для загрузки свойств конфигурации.
Он инициализирует объект на основе данных свойства.
- @ConfigurationProperties определяет файл свойств для загрузки.
- @Configuration создает компонент на основе переменных файла конфигурации.
Вы можете сделать это и так .
Затем, где бы вы ни хотели прочитать данные из application.properties, просто передайте ключ методу getConfigValue.
Найдите это здесь: org.springframework.core.env.Environment Что если местоположение по умолчанию переопределено spring.config.location ?Вы можете использовать @Value для загрузки переменных из, application.properties если вы будете использовать это значение в одном месте, но если вам нужен более централизованный способ загрузки этих переменных @ConfigurationProperties , это лучший подход.
Кроме того, вы можете загружать переменные и автоматически приводить их, если вам нужны разные типы данных для проверки и бизнес-логики.
Следуй этим шагам. 1: - создайте свой класс конфигурации, как показано ниже
2: - когда у вас есть класс конфигурации, введите переменную из конфигурации, где вам нужно.
Приложение может прочитать 3 типа значений из файла application.properties.
application.properties
файл класса
Если у вас нет свойства в application.properties, вы можете использовать значение по умолчанию
Spring-boot позволяет нам использовать несколько методов для предоставления внешних конфигураций, вы можете попробовать использовать файлы application.yml или yaml вместо файла свойств и предоставить разные файлы свойств для настройки в соответствии с различными средами.
Мы можем разделить свойства для каждой среды на отдельные файлы yml под отдельными весенними профилями. Во время развертывания вы можете использовать:
указать, какой весенний профиль использовать. Обратите внимание, что файлы yml должны иметь имя, подобное
для них будет автоматически занято Springboot.
Чтобы прочитать из application.yml или файла свойств:
Самый простой способ прочитать значение из файла свойств или yml - это использовать spring @value annotation.Spring автоматически загружает все значения из yml в среду Spring, поэтому мы можем напрямую использовать эти значения из среды, например:
Или другой метод, который предоставляет Spring для чтения строго типизированных bean-компонентов:
Читайте также: