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