首页 > 其他分享 >springboot - 配置文件 @ConfigurationProperties

springboot - 配置文件 @ConfigurationProperties

时间:2024-03-05 21:23:16浏览次数:16  
标签:springboot 配置文件 private class ConfigurationProperties mail public String

1.简单属性

@Configuration
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
    
    private String hostName;
    private int port;
    private String from;

    // standard getters and setters
}

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

@SpringBootApplication
@EnableConfigurationProperties(ConfigProperties.class)
public class EnableConfigurationDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(EnableConfigurationDemoApplication.class, args);
    }
}

就是这样!Spring 将自动绑定在我们的属性文件中定义的具有前缀mail且与ConfigProperties类中的字段之一同名的任何属性。
Spring 使用一些宽松的规则来绑定属性。因此,以下变体都绑定到属性hostName:

mail.hostName
mail.hostname
mail.host_name
mail.host-name
mail.HOST_NAME

#Simple properties
[email protected]
mail.port=9000
[email protected]

2.spring2.2

从Spring Boot 2.2开始,Spring 通过类路径扫描查找并注册@ConfigurationProperties类。需要通过添加@ConfigurationPropertiesScan注释来显式选择扫描@ConfigurationProperties。因此,我们不必使用@Component(以及@Configuration等其他元注释)来注释此类类,甚至不必使用@EnableConfigurationProperties:

@ConfigurationProperties(prefix = "mail") 
@ConfigurationPropertiesScan 
public class ConfigProperties { 

    private String hostName; 
    private int port; 
    private String from; 

    // standard getters and setters 
}

@SpringBootApplication启用的类路径扫描器会找到ConfigProperties类,即使我们没有使用@Component 注释此类。

此外,我们可以使用@ConfigurationPropertiesScan注释 来扫描配置属性类的自定义位置:

@SpringBootApplication
@ConfigurationPropertiesScan("com.baeldung.configurationproperties")
public class EnableConfigurationDemoApplication { 

    public static void main(String[] args) {   
        SpringApplication.run(EnableConfigurationDemoApplication.class, args); 
    } 
}

3.嵌套属性

public class Credentials {
    private String authMethod;
    private String username;
    private String password;

    // standard getters and setters
}
public class ConfigProperties {

    private String hostname;
    private int port;
    private String from;
    private List<String> defaultRecipients;
    private Map<String, String> additionalHeaders;
    private Credentials credentials;
 
    // standard getters and setters
}

对应的属性文件如下

#Simple properties
[email protected]
mail.port=9000
[email protected]

#List properties
mail.defaultRecipients[0][email protected]
mail.defaultRecipients[1][email protected]

#Map Properties
mail.additionalHeaders.redelivery=true
mail.additionalHeaders.secure=true

#Object properties
mail.credentials.username=john
mail.credentials.password=password
mail.credentials.authMethod=SHA1

4.在@Bean方法上使用@ConfigurationProperties

我们还可以在@Bean注解的方法上使用@ConfigurationProperties注解。
当我们想要将属性绑定到我们无法控制的第三方组件时,这种方法可能特别有用。
让我们创建一个简单的Item类,我们将在下一个示例中使用它:

public class Item {
    private String name;
    private int size;

    // standard getters and setters
}

现在让我们看看如何在@Bean方法上使用@ConfigurationProperties将外部化属性绑定到Item实例:

@Configuration
public class ConfigProperties {

    @Bean
    @ConfigurationProperties(prefix = "item")
    public Item item() {
        return new Item();
    }
}

5.属性验证

例如,让我们强制设置hostName属性:

@NotBlank
private String hostName;

@Length(max = 4, min = 1)
private String authMethod;

@Min(1025)
@Max(65536)
private int port;

@Pattern(regexp = "^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,6}$")
private String from;

6.时间类型

@ConfigurationProperties(prefix = "conversion")
public class PropertyConversion {

    private Duration timeInDefaultUnit;
    private Duration timeInNano;
    ...
}

配置文件:

conversion.timeInDefaultUnit=10
conversion.timeInNano=9ns

我们还可以使用 @DurationUnit 覆盖默认单位:

@DurationUnit(ChronoUnit.DAYS)
private Duration timeInDays;
conversion.timeInDays=2

7.数据大小 - DataSize类型

private DataSize sizeInDefaultUnit;

private DataSize sizeInGB;

@DataSizeUnit(DataUnit.TERABYTES)
private DataSize sizeInTB;
conversion.sizeInDefaultUnit=300
conversion.sizeInGB=2GB
conversion.sizeInTB=4

在这种情况下,sizeInDefaultUnit值将为 300 字节,因为默认单位为字节。
支持的单位有B、KB、MB、GB和TB。我们还可以使用@DataSizeUnit 覆盖默认单位。

8.定制转换器

我们还可以添加自己的自定义转换器来支持将属性转换为特定的类类型。
让我们添加一个简单的Employee类:

public class Employee {
    private String name;
    private double salary;
}

然后我们将创建一个自定义转换器来转换此属性:

conversion.employee=john,2000

我们需要实现Converter接口,然后使用@ConfigurationPropertiesBinding注释来注册我们的自定义Converter:

@Component
@ConfigurationPropertiesBinding
public class EmployeeConverter implements Converter<String, Employee> {

    @Override
    public Employee convert(String from) {
        String[] data = from.split(",");
        return new Employee(data[0], Double.parseDouble(data[1]));
    }
}

9.不可变的@ConfigurationProperties绑定

从 Spring Boot 2.2 开始,我们可以使用@ConstructorBinding注解来绑定我们的配置属性,而不是旧的 setter 注入。
这本质上意味着@ConfigurationProperties注释的类现在可能是不可变的。
在 Spring Boot 3 中,如果只有一个参数化构造函数,则隐含构造函数绑定,我们不需要使用注释。但如果有多个构造函数,我们必须注释首选构造函数:

@ConfigurationProperties(prefix = "mail.credentials")
public class ImmutableCredentials {

    private final String authMethod;
    private final String username;
    private final String password;

    @ConstructorBinding
    public ImmutableCredentials(String authMethod, String username, String password) {
        this.authMethod = authMethod;
        this.username = username;
        this.password = password;
    }

    public ImmutableCredentials(String username, String password) {
        this.username = username;
        this.password = password;
        this.authMethod = "Default";
    }
    public String getAuthMethod() {
        return authMethod;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }
}

正如我们所看到的,当使用 @ConstructorBinding时,我们需要为构造函数提供我们想要绑定的所有参数。
请注意, ImmutableCredentials的所有字段 都是最终字段。此外,没有 setter 方法。
此外,需要强调的是,要使用构造函数绑定,我们需要使用 @EnableConfigurationProperties 或 @ConfigurationPropertiesScan显式启用我们的配置类。

10.Java 16记录

Java 16 引入了 记录 类型作为JEP 395的一部分。记录是充当不可变数据的透明载体的类。这使它们成为配置持有者和 DTO 的完美候选者。事实上,我们可以将Java记录定义为Spring Boot中的配置属性。例如,前面的示例可以重写为:

@ConstructorBinding
@ConfigurationProperties(prefix = "mail.credentials")
public record ImmutableCredentials(String authMethod, String username, String password) {
}

标签:springboot,配置文件,private,class,ConfigurationProperties,mail,public,String
From: https://www.cnblogs.com/dkpp/p/18054988

相关文章

  • SpringBoot中try/catch异常并回滚事务(自动回滚/手动回滚/部分回滚)
    https://www.cnblogs.com/cfas/p/16423510.html https://www.cnblogs.com/konglxblog/p/16229175.htmlSpringBoot异常处理回滚事务详解(自动回滚、手动回滚、部分回滚)(事务失效) 参考:https://blog.csdn.net/zzhongcy/article/details/102893309概念事务定义事务,就是一......
  • SpringBoot3整合Druid数据源的解决方案
    druid-spring-boot-3-starter目前最新版本是1.2.20,虽然适配了SpringBoot3,但缺少自动装配的配置文件,会导致加载时报加载驱动异常。<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.20</version......
  • SpringBoot常用注解
    SpringBoot常用注解  @SpringBootApplication=@SpringBootConfiguration+@ComponentScan+@EnableAutoConfiguration@Configuration注解能够将一个类定义为SpringBoot应用程序中的配置类,等同于spring的XML配置文件,从而使该类中的Bean对象能够被SpringIoC容器进行自动管......
  • spring面试高频问题---springboot自动配置
    springboot自动配置1.springboot自动配置原理自动配置主要依赖于@SpringBootApplication注解,其中还包含了三个注解@SpringBootConfiguration:该注解与@Configuration注解作用相同,用来声明当前也是个配置类。@ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。@Ena......
  • springboot集成报文验证组件validation
    1.引入validation的依赖jar<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>3.2.3</version></dependency>2.请求报文增加字段的校验规则packa......
  • go-ini配置文件操作
    go-ini是golangini文件操作库,也兼容其他格式,包括但不限于my.cnf、.gitconfig使用三方库"gopkg.in/ini.v1"ini文件格式语法;注释使用分号;ini文件语法env=test;[]分区符[mysql]Host=127.0.0.1Port=3306User=rootPassword=123456D......
  • Redis整合Springboot
    六.巅峰1.事务Redis单条命令保证原子性,但是事务不保证原子性原子性:要么同时成功,要么同时失败Redis的事物本质:一组命令的集合,一个事务中的所有命令都会被序列化,事务执行过程中,会按照顺序执行。具有一次性,顺序性,排他性(没有隔离级别的概念)所有的命令在事务中,并没有直接执行,只有......
  • springboot四大特性
    "SpringBoot是一个基于Spring框架的开源框架,具有以下四大特性:简化配置:SpringBoot提供了自动化的配置机制,通过约定大于配置的方式,减少了开发人员的配置工作。它通过Starter模块来管理依赖,简化了项目的构建和管理。内嵌容器:SpringBoot支持内嵌Servlet容器(如Tomcat、Je......
  • Tomcat 的组成结构和主配置文件Server.xml详解
    Tomcat的组成结构和主配置文件Server.xml详解参考:《TOMCAT与JAVAWEB开发技术详解第3版》https://www.jianshu.com/p/2789af11299fTomcat本身由一系列可配置的组件构成,其中核心组件是Servlet容器组件,它是所有其他Tomcat组件的顶层容器,用<CATALINA_HOME>表示Tomca......
  • Tomcat 的组成结构和主配置文件Server.xml详解
    Tomcat的组成结构和主配置文件Server.xml详解参考:《TOMCAT与JAVAWEB开发技术详解第3版》https://www.jianshu.com/p/2789af11299fTomcat本身由一系列可配置的组件构成,其中核心组件是Servlet容器组件,它是所有其他Tomcat组件的顶层容器,用<CATALINA_HOME>表示Tomca......