进阶!@ConfigurationProperties注解高级用法你知道吗?

文摘   2024-10-27 10:02   新疆  

最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。

环境:Spring Boot3.2.5



1. 简介

Spring Boot 有许多有用的功能,包括外部化配置和轻松访问属性文件中定义的属性。如果你想在类定义中或在@Configuration注解的类中的@Bean方法绑定并验证一些外部属性(例如,来自.properties文件),请使用@ConfigurationProperties注解。

@ConfigurationProperties注解的绑定操作要么通过调用被注解类的setter方法来完成,要么(如果使用了@ConstructorBinding)通过绑定到构造器参数来完成。

请注意,与@Value不同,由于属性值被外部化,因此不会处理SpEL表达式。

接下来,我们将深入的讨论关于 @ConfigurationProperties 注解的各种高级用法。

2. 实战案例

2.1 简单属性

官方文档建议我们将配置属性隔离到单独的POJO(Plain Old Java Object,简单的Java对象)中,如下示例:

@Configuration@ConfigurationProperties(prefix = "pack.mail")public class ConfigProperties {
private String hostName ; private int port ;  private String from ; // getters and setters}

@ConfigurationProperties 对具有相同前缀的分层属性效果最佳;因此,我们添加了     pack.mail前缀。

注意:如果我们不在POJO中使用@Configuration注解,那么我们需要在主Spring应用程序类中添加@EnableConfigurationProperties(ConfigProperties.class)注解,以便将属性绑定到POJO中,如下示例:

@SpringBootApplication@EnableConfigurationProperties(ConfigProperties.class)public class MyApplication {}

这样,我们就不需要在ConfigProperties类上添加@Configuration或@Component注解。

Spring 对绑定属性使用了一些宽松的规则。因此,以下变化都绑定到了 hostName 属性:

pack.mail.hostNamepack.mail.hostnamepack.mail.host_namepack.mail.host-namepack.mail.HOST_NAME

因此,我们可以使用下面的属性文件来设置所有字段:

pack:  mail:    hostname: pack@mail.com    port: 9000    from: xxxooo@mail.com

注:如果你配置的值有特殊字符,你可以使用单引号'xxxxx' 。

2.2 配置类扫描

从Spring Boot 2.2开始,Spring通过类路径扫描来查找和注册@ConfigurationProperties类。要使@ConfigurationProperties的扫描生效,需要显式地通过添加@ConfigurationPropertiesScan注解来选择加入。因此,我们不必在这些类上使用@Component(以及其他元注解,如@Configuration),甚至不需要使用@EnableConfigurationProperties,如下示例:

@ConfigurationProperties(prefix = "pack.mail") @ConfigurationPropertiesScan public class ConfigProperties { 
private String hostName ; private int port ; private String from ;   // getters and setters }

如上注解后,Spring Boot会自动的查找那些使用了@ConfigurationProperties注解的类。

此外,我们还可以使用 @ConfigurationPropertiesScan 注解来扫描自定义位置的配置属性类,如下示例:

@SpringBootApplication@ConfigurationPropertiesScan("com.pack.properties")public class MyApplication { 
public static void main(String[] args) {     SpringApplication.run(MyApplication.class, args) ;  } }

这样,Spring 将只在 com.pack.properties 包中查找配置属性类。

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章