Поиск по сайту:

Весна @PropertySource


Аннотация Spring @PropertySource используется для предоставления файла свойств в Spring Environment. Эта аннотация используется с классами @Configuration. Аннотация Spring PropertySource повторяема, что означает, что вы можете иметь несколько PropertySource в классе конфигурации. Эта функция доступна, если вы используете Java 8 или более позднюю версию.

Пример Spring PropertySource

Давайте быстро рассмотрим простое приложение Spring, в котором мы прочитаем сведения о конфигурации базы данных из файла свойств и создадим соединение с базой данных. Мы выведем некоторые метаданные базы данных на консоль. Создайте простой проект 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 Database Configurations
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());

		// close the spring context
		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 не генерировать исключение, если файл не найден.

@PropertySource(value = "classpath:root.properties", ignoreResourceNotFound=true)

Это все, что касается примера Spring PropertySource. Вы можете проверить исходный код и проект maven из нашего репозитория GitHub.

Весенний проект PropertySource