Весна @PropertySource

Весна @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.

Проект Spring PropertySource

Source:
https://www.digitalocean.com/community/tutorials/spring-propertysource