Spring Boot 中的 @ConfigurationProperties 注解

x33g5p2x  于2021-10-16 转载在 Spring  
字(3.8k)|赞(0)|评价(0)|浏览(373)

@ConfigurationProperties 注释用于从属性文件中提取**“一组配置值”**。 @ConfigurationProperties 注释还用于在开发基于微服务架构的应用程序时进行外部化配置。

它与我们在之前的一篇 Spring Boot 博客中讨论过的 @Value 注释最相似。

@ConfigurationProperties 与 @Value 注释

@ConfigurationProperties 注释和 @Value 注释的主要区别是:

  1. @ConfigurationProperties 注释用于从属性文件中注入一组类似的 (prefix) 值,而 @Value 注释用于注入单个/特定值。
  2. @ConfigurationProperties 是用 POJO bean 映射属性,@Value 是通过它的键注入一个特定的属性值。

需要依赖

使用 @ConfigurationProperties 注释不需要特殊的依赖项。 spring-boot-starter-parent 就足够了。

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.2.4.RELEASE</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

1. 绑定值形成 application.properties 文件

这是 application.properties 文件,我们在其中使用前缀 user 对用户详细信息进行了分组。
application.properties

app.name=Config Annotation
app.desc= This is Spring Boot Project

# Grouped propeties 
user.id=atul
user.name=Atul Rai
user.password=Hello@123
user.role=ADMIN

现在让我们创建相应的 POJO 类,这些属性值将注入其中。 @ConfigurationProperties 注释有一个属性,即 prefix,我们可以在其中映射我们的属性键。

UserConfiguration.java

package org.websparrow.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "user")
public class UserConfiguration {

	// Generate Getters and Setters...
	private String id;
	private String name;
	private String password;
	private String role;

	@Override
	public String toString() {
		return "UserConfiguration [id=" + id + ", name=" + name + ", password="
				+ password + ", role=" + role + "]";
	}

}

注意: 如果我们在 POJO 中不使用 @Configuration,那么我们需要在主 Spring 应用程序类中添加 @EnableConfigurationProperties(*UserConfiguration*.class) 来将属性绑定到 POJO 中。

2. 绑定值形成 application.yaml 文件

application.properties 文件类似,我们也可以从 application.yaml 文件中注入属性值。
application.yaml

app:
  name: Config Annotation
  desc: This is Spring Boot Project

# Grouped propeties 
user:
  id: manish
  name: Manish
  password: abc@123
  role: USER

3. 绑定值形成任何属性文件

我们可以从任何属性文件(database.properties)注入值。在这种情况下,我们将使用 @PropertySource 批注加载属性文件。

为此,这里是保存所有数据库凭据的属性文件。
database.properties

db.port=34
db.host=127.0.0.1
db.user=root
db.password=admin@123

相应的 POJO 如下所示:

DBConfiguration.java

package org.websparrow.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:database.properties")
@ConfigurationProperties(prefix = "db")
public class DBConfiguration {

	// Generate Getters and Setters
	private int port;
	private String host;
	private String user;
	private String password;

	@Override
	public String toString() {
		return "DBConfiguration [port=" + port + ", host=" + host + ", user="
				+ user + ", password=" + password + "]";
	}
}

测试应用程序

对于应用程序是否从属性文件中提取值,我们创建了 MyController 类并使用 @Autowired 注释自动装配了两个配置类。
MyController.java

package org.websparrow.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.websparrow.config.DBConfiguration;
import org.websparrow.config.UserConfiguration;

@RestController
public class MyController {

	@Autowired
	private UserConfiguration userConfiguration;

	@Autowired
	private DBConfiguration dbConfiguration;

	@GetMapping("/config")
	public String userConfiguration() {

		return userConfiguration.toString();
	}

	@GetMapping("/database")
	public String databaseConfiguration() {

		return dbConfiguration.toString();
	}
}

到这里,我们完成了 🙂 只需启动您的应用程序并在您最喜欢的浏览器中点击以下端点:

  1. http://localhost:8080/config

它将从 application.properties 文件中注入按 user 分组的值。

UserConfiguration [id=atul, name=Atul, password=Hello@123, role=ADMIN]
  1. http://localhost:8080/database

它将注入 database.properties 文件中按 db 分组的值。

DBConfiguration [port=34, host=127.0.0.1, user=root, password=admin@123]

相关文章