Весна @PropertySource аннотация используется для предоставления файлов свойств в Spring Environment. Эта аннотация используется с классами @Configuration
. Аннотация Spring PropertySource может повторяться, что означает, что вы можете иметь несколько PropertySource в классе Configuration. Эта функция доступна при использовании Java 8 или более поздней версии.
Пример Spring PropertySource
Давайте быстро рассмотрим простое весеннее приложение, где мы будем читать детали конфигурации базы данных из файла свойств и создавать подключение к базе данных. Мы выведем некоторую метаинформацию о базе данных в консоль. Создайте простой проект Maven и добавьте зависимости Spring и MySQL. Вы можете использовать любую другую базу данных для примера, просто измените конфигурации соответственно.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
Ниже показана структура нашего проекта, мы рассмотрим все важные компоненты один за другим. Вот наш класс для создания подключения к базе данных.
package com.journaldev.spring;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {
private String driverClass;
private String dbURL;
private String userName;
private char[] password;
private Connection con;
public DBConnection(String driverClass, String dbURL, String userName, char[] password) {
this.driverClass = driverClass;
this.dbURL = dbURL;
this.userName = userName;
this.password = password;
}
public Connection getConnection() {
if (this.con != null)
return con;
Connection con = null;
try {
System.out.println("Creating DB Connection");
Class.forName(driverClass);
con = DriverManager.getConnection(dbURL, userName, String.valueOf(password));
System.out.println("Successfully Created DB Connection");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
this.con = con;
return con;
}
public void close() {
System.out.println("DBConnection close called");
if (this.con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Примечание: Если вы создаете приложение в реальном мире, вы можете использовать Spring ORM. Таким образом, Spring будет заботиться о управлении подключением к базе данных, и вы сможете сосредоточиться на написании бизнес-логики. Теперь давайте создадим класс конфигурации Spring, где мы будем использовать аннотацию PropertySource
.
package com.journaldev.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
@Configuration
@PropertySource("classpath:db.properties")
@PropertySource("classpath:root.properties")
public class DBConfiguration {
@Autowired
Environment env;
@Bean
public DBConnection getDBConnection() {
System.out.println("Getting DBConnection Bean for App: "+env.getProperty("APP_NAME"));
DBConnection dbConnection = new DBConnection(env.getProperty("DB_DRIVER_CLASS"), env.getProperty("DB_URL"), env.getProperty("DB_USERNAME"), env.getProperty("DB_PASSWORD").toCharArray());
return dbConnection;
}
}
Обратите внимание, что я загружаю несколько файлов свойств в среду Spring. Давайте посмотрим на содержимое этих файлов свойств. db.properties
#Конфигурации базы данных MYSQL
DB_DRIVER_CLASS=com.mysql.jdbc.Driver
DB_URL=jdbc:mysql://localhost:3306/Test
DB_USERNAME=journaldev
DB_PASSWORD=journaldev
root.properties
APP_NAME=PropertySource Example
Создадим основной класс и получим детали базы данных.
package com.journaldev.spring;
import java.sql.Connection;
import java.sql.SQLException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringMainClass {
public static void main(String[] args) throws SQLException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan("com.journaldev.spring");
context.refresh();
DBConnection dbConnection = context.getBean(DBConnection.class);
Connection con = dbConnection.getConnection();
System.out.println(con.getMetaData().getDatabaseProductName());
System.out.println(con.getMetaData().getDatabaseProductVersion());
// закрыть контекст Spring
context.close();
}
}
Просто запустите вышеуказанный класс как приложение Java, и он выдаст следующий вывод.
Getting DBConnection Bean for App: PropertySource Example
Creating DB Connection
Successfully Created DB Connection
MySQL
5.7.18
DBConnection close called
Для лучшей читаемости я убрал отладочные сообщения, выводимые Spring в консоль.
Spring @PropertySource Множественные файлы – @PropertySources
Есть еще один способ загрузки нескольких файлов свойств для класса конфигурации.
@PropertySources({
@PropertySource("classpath:db.properties"),
@PropertySource("classpath:root.properties")})
public class DBConfiguration {
}
С начала Java 8 аннотация PropertySource стала повторяемой. Для более ранних версий Java использовалась аннотация @PropertySources
для предоставления нескольких файлов свойств в класс конфигурации.
Переопределение значений свойств Spring PropertySource
Мы можем загружать несколько файлов свойств в среду Spring. Если в нескольких файлах присутствуют одинаковые ключи, то последний загруженный файл свойств переопределит ранее заданные значения. Поэтому, если вы получаете нежелательные значения для своих свойств, проверьте, присутствует ли такой же ключ в любом другом файле свойств и каков порядок загрузки этих файлов свойств.
Внешний файл свойств Spring PropertySource
Иногда наши файлы конфигурации находятся в определенном месте и не являются частью пути к классам проекта. Мы можем настроить PropertySource для загрузки файлов свойств из файловой системы.
@PropertySource("file:/Users/pankaj/db.properties")
Переменная среды Spring PropertySource
Обратите внимание, что вышеуказанная конфигурация для чтения файла свойств из внешнего расположения будет работать на моей локальной системе, но не для кого-то еще или на сервере. Мы также можем читать системные переменные в PropertySource, поэтому нижняя конфигурация будет работать для всех.
@PropertySource("file:${HOME}/db.properties")
Spring PropertySource игнорирует FileNotFoundException
Если файл свойств не найден, мы получим FileNotFoundException
. Иногда мы не хотим вызывать исключение, потому что наше приложение может работать и с значениями по умолчанию. Мы можем использовать PropertySource ignoreResourceNotFound
и установить значение true
, чтобы сообщить Spring framework не вызывать исключение, если файл не найден.
@PropertySource(value = "classpath:root.properties", ignoreResourceNotFound=true)
Вот и все для примера использования Spring PropertySource. Вы можете проверить исходный код и проект Maven в нашем репозитории GitHub.
Source:
https://www.digitalocean.com/community/tutorials/spring-propertysource