Как получить данные из файла свойств Spring

Обновлено: 21.11.2024

В этом посте мы увидим, как внедрить вашу конфигурацию в файл свойств в Spring и как считывать значения из файла свойств в Spring, используя конфигурацию XML и аннотацию @PropertySource.

Рекомендуется помещать настройки приложения в отдельные файлы свойств, а не жестко задавать их в конфигурации. Например, свойства конфигурации, связанные с базой данных, такие как URL-адрес БД, класс драйвера, пользователь, пароль, могут храниться в файле свойств и считываться оттуда или в приложении для отправки электронных писем. Параметры SMTP, такие как хост, пользователь, пароль, могут храниться в файле свойств.

Файл свойств в Spring с использованием конфигурации XML

Вы можете настроить заполнители свойств с помощью XML. Заменяемые значения указываются в виде заполнителей в форме $. Во время выполнения к метаданным применяется PropertySourcesPlaceholderConfigurer, он проверяет наличие заполнителей в файле свойств и заменяет значения заполнителей, соответствующие ключам в файле свойств.

Обратите внимание, что org.springframework.context.support.PropertySourcesPlaceholderConfigurer используется в версии Spring framework 5.2 до того, как был использован класс org.springframework.beans.factory.config.PropertyPlaceholderConfigurer, который устарел в Spring 5.2.

При использовании элемента PropertySourcesPlaceholderConfigurer регистрируется автоматически.

Например, файл app.properties сохранен в папке /src/main/resources/, поэтому он находится в пути к классам.

Конфигурация XML

Как видите, файл свойств регистрируется с помощью элемента путем указания местоположения файла свойств.

Указание нескольких файлов свойств с помощью XML

Вы можете передать несколько файлов свойств в атрибуте местоположения в виде значений, разделенных запятыми

Файл свойств в Spring с использованием аннотации @PropertySource

Существует также аннотация @PropertySource, которая обеспечивает удобный и декларативный механизм для добавления PropertySource в среду Spring.

Вы можете использовать аннотацию @PropertySource вместе с аннотацией @Value для вставки значений, считанных из файла свойств, но лучше использовать Spring Environment.

@PropertySource с @Value для ввода значений

Обратите внимание, что класс PropertySourcesPlaceholderConfigurer используется для разрешения заполнителей $ в аннотациях @Value для текущей среды Spring.

Выполнение примера с использованием следующего класса:

Вывод

@PropertySource со средой для чтения значений свойств

Аннотация @PropertySource добавляет источник PropertySource в среду Spring, поэтому использование метода getProperty() среды является более удобным способом чтения свойств, чем использование аннотации @Value.

Обратите внимание, как внедряется org.springframework.core.env.Environment, и этот объект используется для получения свойств.

Возможности Spring @PropertySource

  1. Любые заполнители $, присутствующие в местоположении ресурса @PropertySource, сопоставляются с набором источников свойств, уже зарегистрированных в среде. Например

Если app.path присутствует в одном из уже зарегистрированных источников свойств (например, системных свойствах или переменных среды), заполнитель преобразуется в соответствующее значение. Если нет, то по умолчанию используется default/path. Если значение по умолчанию не указано и свойство не может быть разрешено, создается исключение IllegalArgumentException.

Игнорировать исключение, если значение не найдено

Если файл свойств не найден или переданный ключ не существует в файле свойств, среда Spring по умолчанию выдает исключение. Если у вас есть файл свойств, который может существовать, а может и не существовать, и вы не хотите, чтобы возникало исключение, если оно не существует, вы можете указать для атрибута ignoreResourceNotFound значение true.

С аннотацией @PropertySource

В конфигурации XML

В конфигурации XML вы также можете указать атрибут ignore-unresolvable, чтобы игнорировать исключение, если заполнитель не может быть разрешен.

Переопределение свойства с помощью @PropertySource

Если данный ключ свойства существует более чем в одном файле .properties, последняя обработанная аннотация @PropertySource переопределит значения для таких повторяющихся ключей.

Например, при наличии двух файлов свойств a.properties и b.properties рассмотрите следующие два класса конфигурации, которые ссылаются на них с помощью аннотаций @PropertySource:

Порядок переопределения зависит от порядка, в котором эти классы зарегистрированы в контексте приложения.

В приведенном выше сценарии свойства в b.properties переопределяют любые дубликаты, существующие в a.properties, поскольку ConfigB был зарегистрирован последним.

Похожие сообщения

Это все, что касается темы Чтение значений из файла свойств в Spring. Если чего-то не хватает или вам есть чем поделиться по теме, напишите комментарий.

Я использую Spring.Мне нужно прочитать значения из файла свойств. Это файл внутренних свойств, а не файл внешних свойств. Файл свойств может быть таким, как показано ниже.

Мне нужно прочитать эти значения из файла свойств не традиционным способом. Как этого добиться? Есть ли какой-нибудь последний подход к весне 3.0?

Если это файл свойств в смысле Java - да. В противном случае это пользовательский формат файла, который необходимо обрабатывать по-другому (и вы не можете просто использовать строки в качестве значений свойств в Spring, если у них нет ключа).

10 ответов 10

Настройте PropertyPlaceholder в своем контексте:

Затем вы обращаетесь к свойствам вашего bean-компонента:

Чтобы проанализировать свойство с несколькими значениями, разделенными запятыми:

Если это не сработает, вы можете определить bean-компонент со свойствами, внедрить и обработать его вручную:

Привет, mrembisz, спасибо за ответ. я уже настроил свойство-заполнитель для чтения значений из внешнего файла свойств. но у меня есть один файл свойств внутри папки ресурсов. мне нужно прочитать и ввести. мне нужно ввести все значения в список. Спасибо!

Отредактировано по предложению @Ethan. Спасибо за обновление, не удалось принять исходное редактирование, было уже слишком поздно.

Есть разные способы добиться того же. Ниже приведены некоторые часто используемые способы в spring-

Предположим, что ds.type является ключевым в вашем файле свойств.

Использование PropertyPlaceholderConfigurer

Зарегистрировать bean-компонент PropertyPlaceholderConfigurer-

После регистрации PropertySourcesPlaceholderConfigurer вы можете получить доступ к значению-

Использование PropertySource

В последней весенней версии вам не нужно регистрировать PropertyPlaceHolderConfigurer с помощью @PropertySource , я нашел хорошую ссылку, чтобы понять совместимость версий-

Использование ResourceBundleMessageSource

Использование PropertiesFactoryBean

Привяжите экземпляр Properties к вашему классу-

Для использования PropertySourcesPlaceholderConfigurer обычно необходимо указать местоположение или ресурс, иначе вы не сможете получить доступ к файлу свойств. Вы можете использовать, например. ClassPathResource generalProperties = новый ClassPathResource("general.properties");

В классе конфигурации

В этом примере вы бы просто использовали разные app.properties в рабочей среде или при тестировании? Другими словами, будет ли частью вашего процесса развертывания замена app.properties производственными значениями?

@KevinMeredith мы используем папку вне войны развертывания: например, c:\apps\sys_name\conf\app.properties . Процесс развертывания упрощается и становится менее подверженным ошибкам.

любые bean-компоненты BeanFactoryPostProcessor должны быть объявлены со статическим модификатором

@dubey-theHarcourtians, какую версию Spring (основную) вы используете? если вы используете Spring Boot, вам вообще не нужен @PropertySource.

Если вам нужно вручную прочитать файл свойств без использования @Value.

Спасибо Локешу Гупте за хорошо написанную страницу: Блог

Еще один способ — использовать ResourceBundle. По сути, вы получаете пакет, используя его имя без «.properties»

И вы восстанавливаете любое значение, используя это:

Вам нужно поместить bean-компонент PropertyPlaceholderConfigurer в контекст вашего приложения и установить его свойство местоположения.

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

Мне нужен служебный класс, который не управляется Spring, поэтому никаких весенних аннотаций, таких как @Component , @Configuration и т. д., Но я хотел, чтобы класс читал из application.properties

Мне удалось заставить его работать, заставив класс знать о Spring Context, следовательно, о Environment , и, следовательно, environment.getProperty() работает, как и ожидалось.

Если быть точным, у меня есть:

application.properties

Utils.java

ApplicationContextProvider.java (см. Spring для получения текущего ApplicationContext)

Свойства приложения могут различаться в разных средах, например, как хосты в вашей среде контроля качества могут отличаться от ваших локальных и рабочих сред. Используя Spring Boot, различные среды можно настраивать и обновлять отдельно, не затрагивая другие среды с помощью файлов свойств.

В этой статье мы покажем способы доступа к значениям, определенным в файле свойств в проекте Spring Boot, и способы управления ими в коде.

Файлы свойств Spring Boot

Spring Boot предоставляет способ экстернализации конфигураций с помощью файлов свойств, расположенных в пути к классам проекта. Это очень полезно для настройки нескольких сред, так как свойства можно динамически настраивать для каждой среды.

Файл свойств по умолчанию, создаваемый Spring Boot, называется application.properties и находится в каталоге проекта src/main/resources/. При инициализации проекта файл свойств по умолчанию пуст.

Вот пример файла application.properties, содержащего два примера свойств:

Этот образец файла содержит значения для имени пользователя источника данных и корневого уровня ведения журнала приложения. Свойства имеют тот же синтаксис ключ=значение.

Файлы свойств YAML

Кроме того, вместо стандартного синтаксиса .properties Spring Boot также поддерживает файлы свойств в формате YAML. Таким образом, вместо файла application.properties по умолчанию вы можете создать новый файл свойств application.yml, если предпочитаете свои свойства в формате YAML:

Единственная разница, которую это повлечет за собой, — это форматирование содержимого в файле, поэтому выбор основан исключительно на предпочтениях.

Spring Boot позволяет объявлять несколько файлов свойств с помощью аннотации @PropertySource, определенной через класс конфигурации.

Доступ к значениям в файлах свойств в Spring Boot

Теперь мы переходим к основной теме — как получить доступ к значениям в вышеупомянутых файлах свойств.

Использование аннотации @Value

Аннотация @Value — это предопределенная аннотация, используемая для чтения значений из любых файлов свойств в пути к классам проекта.

Чтобы получить доступ к значению отдельного свойства из файла свойств с помощью этой аннотации, укажите имя свойства в качестве аргумента:

Если мы напечатаем приведенную выше переменную без каких-либо дополнительных манипуляций, вывод должен быть значением указанного свойства, объявленного в аннотации @Value. В этом случае он должен вывести строку user :

Если свойство, объявленное в аннотации, не существует ни в одном файле свойств, будет соблюдаться инициализация типа данных по умолчанию. В этом случае для переменной username будет установлено значение null .

Обновление значения переменной, помеченной аннотацией @Value, также изменяет фактическое значение свойства, введенного в переменную во время выполнения:

Обратите внимание, что изменения, внесенные во время выполнения, будут сброшены после завершения работы программы, поэтому эти изменения не отразятся в фактическом файле свойств. Это означает, что значения свойств являются более динамичными, а не просто постоянными значениями.

Вот ссылка на наше подробное руководство по аннотации @Value, если вы хотите узнать о ней больше.

Использование объекта среды

Еще один метод доступа к значениям, определенным в Spring Boot, – автоматическое связывание объекта Environment и вызов метода getProperty() для доступа к значению файла свойств.

Метод getProperty() принимает один обязательный параметр, представляющий собой строку, содержащую имя свойства, и возвращает значение этого свойства, если оно существует. Если свойство не существует, метод вернет нулевое значение.

Бесплатная электронная книга: Git Essentials

Ознакомьтесь с нашим практическим руководством по изучению Git, включающим передовые практики, общепринятые стандарты и памятку. Перестаньте гуглить команды Git и на самом деле изучите их!

Для этого примера давайте получим доступ к свойству logging.level.root и сохраним его в строковом значении:

Если вызвать и распечатать метод getRootLogLevel(), он распечатает значение свойства, если оно существует. С приведенным выше примером файла свойств этот метод должен выводить INFO .

Использование аннотации @ConfigurationProperties

Аннотация @ConfigurationProperties — это более широкий подход, чем аннотация @Value и объект Environment.

Этот метод используется для доступа к связанным группам свойств путем сохранения конфигурации в POJO (обычный старый объект Java) и использования POJO для дальнейшего доступа, в отличие от предыдущих решений, в которых доступ к свойствам осуществляется по отдельности.

Аннотация @ConfigurationProperties сопоставляет значения с учетом префикса группы свойств.

Для этого решения давайте создадим новый файл application.properties:

Все 3 свойства, настроенные в файле, имеют одинаковый префикс spring.demo .

Теперь давайте создадим класс конфигурации для сопоставления значений этих свойств с помощью аннотации @ConfigurationProperties.

Обратите внимание, что помимо аннотации класса с помощью @ConfigurationProperties , вам также необходимо аннотировать его с помощью @Configuration, чтобы сообщить системе, что класс является классом конфигурации.

Кроме того, имена переменных в классе должны совпадать с именами в файле свойств с заданным префиксом. Давайте создадим класс DemoProperties:

Теперь, когда конфигурация объявлена, экземпляр DemoProperties можно использовать в любом месте на уровне службы для доступа к значениям свойств, просто автоматически подключая класс:

Вызов метода printDemoProperties() приведет к выводу:

Заключение

В этой статье были рассмотрены три различных способа доступа к определениям значений в Spring Boot. Все это довольно легко понять и применить в своих проектах!

Аннотация @Value является наиболее часто используемым решением для доступа к значениям свойств в Spring Boot. Объект Environment используется не так часто, но все же является жизнеспособным способом доступа к значению свойства.

Аннотация @ConfigurationProperties является более полной и должна использоваться только для больших групп свойств с одинаковым префиксом и одинаковым контекстом, поскольку вам потребуется приспособить это решение, создав POJO для хранения группы значений свойств. .

В этой статье мы узнаем кое-что о чтении свойств в файле с помощью среды Spring. Приступим.

Оглавление

Как использовать аннотацию @ConfigurationProperties

У нас есть содержимое файла свойств.

Как использовать @PropertySource с @Value

Объединить настройки в объект

Использовать аннотацию @ConfigurationProperties

По умолчанию файл application.properties считывается из Spring Boot. Если мы хотим указать другой файл свойств, мы можем использовать аннотацию @PropertySource.

Использовать аннотацию @Value

Использовать класс свойств

Если мы не хотим использовать аннотацию для чтения файла свойств, мы можем использовать класс Properties для непосредственного чтения файла. Но это не рекомендуемый способ борьбы с этим.

Порядок установки свойств при загрузке Spring

При использовании Spring Boot свойства загружаются в следующем порядке (см. Внешняя конфигурация в справочном руководстве по Spring Boot).

Аргументы командной строки.

Свойства системы Java (System.getProperties()).

Переменные среды ОС.

Атрибуты JNDI из java:comp/env

RandomValuePropertySource со свойствами только в случайном порядке.*.

Свойства приложения за пределами упакованного jar-файла (application. properties, включая YAML и варианты профиля).

Свойства приложения, упакованные внутри вашего jar-файла (application.properties, включая YAML и варианты профиля).

Аннотации @PropertySource к вашим классам @Configuration.

Свойства по умолчанию (указаны с помощью SpringApplication.setDefaultProperties).

При разрешении свойств (например, @Value("$") разрешение выполняется в обратном порядке (начиная с 9).

Чтобы добавить разные файлы, вы можете использовать свойства spring.config.location, которые принимают разделенный запятыми список файлов свойств или расположения файлов (каталогов).

Приведенный выше добавит каталог, который будет использоваться для файлов application.properties.

Это добавит 2 файла свойств к загружаемым файлам.

Файлы конфигурации и местоположения по умолчанию загружаются перед дополнительно указанными файлами spring.config.location, что означает, что последние всегда будут переопределять свойства, установленные в более ранних. (См. также этот раздел Справочного руководства по Spring Boot).

Другой способ добавить несколько файлов свойств — использовать класс PropertyPlaceHolderConfigurer

Подведение итогов

Понимание того, как использовать @ConfigurationProperties, @PropertySource и @Value.

@ConfigurationProperties поддерживает файлы как .properties, так и .yml.

Учебники и публикации о Java, Spring, Hadoop и многом другом. Примеры кода Java и вопросы для интервью. Примеры кода Spring.

Среда, 16 января 2019 г.

Как читать файл свойств в Spring Framework

В этом сообщении показано, как читать файл свойств в среде Spring с помощью настройки XML или с помощью аннотации @PropertySource.

Существуют сценарии, когда вам нужно предоставить несколько свойств конфигурации, чтобы настроить ресурс, например, в случае с базой данных вам нужно указать класс драйвера, местоположение БД, имя пользователя и пароль или в случае отправки почты через ваше приложение вам нужно для предоставления таких свойств, как хост SMTP, имя пользователя, пароль.

Нередко разработчики помещают все эти детали в сам XML-файл конфигурации Spring, что не является хорошей практикой. Лучше поместить их в файл свойств, чтобы вы могли иметь определенные файлы свойств, такие как db.properties, mail.properties, app.properties и т. д., и читать значение свойства из этого файла свойств, а не жестко кодировать их. Еще одним преимуществом является то, что любое изменение любого параметра потребует от вас изменения только определенного файла свойств.

  • Конфигурация XML
  • Использование аннотации @PropertySource

Чтение файла свойств в Spring с использованием конфигурации XML

Предположим, что у вас есть свойства базы данных в файле свойств с именем db.properties, который находится в папке config в папке ресурсов.

db.properties (для подключения к БД MYSQL)

Затем вы можете использовать заполнители $ в определениях. Чтобы разрешить эти заполнители, вы должны зарегистрировать PropertySourcesPlaceholderConfigurer. Это происходит автоматически при использовании в XML.

Полная конфигурация XML

Чтение файла свойств в Spring с использованием аннотации @PropertySource

В Spring также есть аннотация @PropertySource (добавленная в Spring 3.1) для чтения файла свойств. Его можно использовать с аннотацией @Value для чтения значения данного свойства.

Пример программы

Учитывая файл db.properties (использованный выше), содержащий пару ключ/значение, следующий класс @Configuration использует @PropertySource вместе с аннотацией @Value для чтения свойств.

Здесь вы можете увидеть, как поля снабжены аннотацией @Value(имя ключа свойства), чтобы сопоставить их с определенным свойством в файле .properties.

Для разрешения заполнителей $ в определениях или аннотаций @Value с использованием свойств из PropertySource необходимо зарегистрировать PropertySourcesPlaceholderConfigurer. Это происходит автоматически при использовании в XML (в приведенном выше примере), но должно быть явно зарегистрировано с помощью статического метода @Bean при использовании классов @Configuration. Это то, что делается в классе DBConfig.

Если вы хотите запустить это, вы можете использовать следующий класс -

Использование аннотации @PropertySource в среде Spring

Вместо использования аннотации @Value для чтения файла свойств в Spring следует использовать Environment. На самом деле аннотация @PropertySource добавляет PropertySource в среду Spring, чтобы его можно было использовать для упрощения кода.

Пример чтения файла свойств с помощью среды

В этом случае вам просто нужно Autowire (или внедрить) Environment в ваш класс Config и использовать объект Environment для получения значения свойства.

Переопределение свойства с помощью @PropertySource

В случаях, когда данный ключ свойства существует более чем в одном файле .properties, последняя обработанная аннотация @PropertySource будет "выигрывать" и переопределять. Например, при наличии двух файлов свойств a.properties и b.properties рассмотрите следующие два класса конфигурации, которые ссылаются на них с помощью аннотаций @PropertySource:

Порядок переопределения зависит от порядка регистрации этих классов в контексте приложения.

Использование атрибута ignoreResourceNotFound с @PropertySource

Если ваш файл свойств является необязательным и вы не хотите, чтобы возникало исключение, если оно не существует, вы можете использовать атрибут ignoreResourceNotFound и установить для него значение true. Значение по умолчанию — ложь.

Если вы хотите загрузить файл test.properties и игнорировать ресурс, если он не найден, вы можете сделать это следующим образом:

Это все, что касается этой темы. Как читать файл свойств в Spring Framework. Если у вас есть какие-либо сомнения или какие-либо предложения, пожалуйста, оставьте комментарий. Спасибо!

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