Spring @PropertySource
Spring @PropertySource注释用于向 Spring 环境提供属性文件。此注释与@Configuration
类一起使用。Spring PropertySource 注释是可重复的,这意味着您可以在 Configuration 类上拥有多个 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 将负责数据库连接管理,您可以专注于编写业务逻辑。现在让我们创建将使用PropertySource
注释的 Spring 配置类。
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 ignore FileNotFoundException
If the property file is not found, then we will get FileNotFoundException
. Sometimes we don’t want to throw exception because our application can work with default values too. We can use PropertySource ignoreResourceNotFound
to true
to tell Spring framework to don’t throw exception if file is not found.
@PropertySource(value = "classpath:root.properties", ignoreResourceNotFound=true)
That’s all for Spring PropertySource Example. You can checkout source code and maven project from our GitHub Repository.