• 注解详解系列 - @ConfigurationProperties:外部配置属性绑定


    注解简介

    在今天的注解详解系列中,我们将探讨@ConfigurationProperties注解。@ConfigurationProperties是Spring Boot提供的一个强大注解,用于将外部配置文件中的属性映射到Java类中。通过@ConfigurationProperties注解,可以方便地将配置文件中的属性注入到应用程序中,从而实现配置的集中管理和解耦。


    注解定义

    @ConfigurationProperties注解用于将外部配置文件中的属性绑定到Java类的字段上。以下是一个基本的示例:

    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    @Component
    @ConfigurationProperties(prefix = "app")
    public class AppProperties {
    
        private String name;
        private String version;
    
        // Getters and setters
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getVersion() {
            return version;
        }
    
        public void setVersion(String version) {
            this.version = version;
        }
    }
    

    在这个示例中,AppProperties类使用了@ConfigurationProperties(prefix = "app")注解,这意味着该类的字段会绑定到配置文件中以app为前缀的属性。


    注解详解

    @ConfigurationProperties注解是Spring Boot中用于将外部配置文件中的属性绑定到Java类的注解。它的主要功能是通过将配置文件中的属性与Java类的字段进行绑定,从而简化配置的管理和使用。

    @ConfigurationProperties注解的作用包括:

    • 属性绑定:将外部配置文件中的属性映射到Java类的字段上,从而实现配置的集中管理。
    • 类型安全:通过将配置属性绑定到Java类,确保配置的类型安全性。
    • 简化配置:通过注解配置简化了属性的注入和使用,使代码更加清晰和易于维护。

    使用场景

    @ConfigurationProperties注解广泛用于Spring Boot应用程序中,用于管理和注入外部配置属性。例如,可以将应用程序的配置信息、数据库连接属性、第三方服务的API密钥等绑定到Java类中。


    示例代码

    以下是一个使用@ConfigurationProperties注解的代码示例,展示了如何在Spring Boot应用程序中绑定和使用外部配置属性:

    application.yml配置文件

    app:
      name: MyApp
      version: 1.0.0
      server:
        port: 8080
        address: localhost
    

    AppProperties.java类

    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    @Component
    @ConfigurationProperties(prefix = "app")
    public class AppProperties {
    
        private String name;
        private String version;
        private Server server;
    
        // Getters and setters
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getVersion() {
            return version;
        }
    
        public void setVersion(String version) {
            this.version = version;
        }
    
        public Server getServer() {
            return server;
        }
    
        public void setServer(Server server) {
            this.server = server;
        }
    
        public static class Server {
            private int port;
            private String address;
    
            public int getPort() {
                return port;
            }
    
            public void setPort(int port) {
                this.port = port;
            }
    
            public String getAddress() {
                return address;
            }
    
            public void setAddress(String address) {
                this.address = address;
            }
        }
    }
    

    使用AppProperties的服务类

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class MyAppService {
    
        private final AppProperties appProperties;
    
        @Autowired
        public MyAppService(AppProperties appProperties) {
            this.appProperties = appProperties;
        }
    
        public void printAppDetails() {
            System.out.println("App Name: " + appProperties.getName());
            System.out.println("App Version: " + appProperties.getVersion());
            System.out.println("Server Address: " + appProperties.getServer().getAddress());
            System.out.println("Server Port: " + appProperties.getServer().getPort());
        }
    }
    

    在这个示例中:

    • application.yml文件中定义了应用程序的配置信息。
    • AppProperties类使用@ConfigurationProperties注解,将配置文件中的属性绑定到类的字段上。
    • MyAppService类通过注入AppProperties类来使用这些配置属性。

    高级用法

    嵌套属性

    @ConfigurationProperties注解支持嵌套属性的绑定。可以通过定义嵌套的静态类来实现。例如,前面的示例中已经展示了如何绑定嵌套的Server属性。

    属性验证

    可以使用javax.validation中的注解来验证配置属性。例如:

    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    
    @Component
    @ConfigurationProperties(prefix = "app")
    public class AppProperties {
    
        @NotNull
        private String name;
    
        @Size(min = 3, max = 10)
        private String version;
    
        // Getters and setters
    }
    

    在这个示例中,name属性不能为空,version属性的长度必须在3到10之间。

    绑定列表和映射

    可以使用@ConfigurationProperties注解将配置文件中的列表和映射绑定到Java类的字段上。例如:

    app:
      servers:
        - address: server1.example.com
          port: 8081
        - address: server2.example.com
          port: 8082
      properties:
        key1: value1
        key2: value2
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    import java.util.Map;
    
    @Component
    @ConfigurationProperties(prefix = "app")
    public class AppProperties {
    
        private List<Server> servers;
        private Map<String, String> properties;
    
        // Getters and setters
    
        public static class Server {
            private String address;
            private int port;
    
            // Getters and setters
        }
    }
    

    在这个示例中,servers字段绑定到配置文件中的服务器列表,properties字段绑定到配置文件中的键值对映射。


    常见问题

    问题:如何在测试中使用@ConfigurationProperties

    解决方案:可以在测试类中使用@TestPropertySource注解或通过@SpringBootTest注解中的properties属性来加载测试配置文件。例如:

    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.TestPropertySource;
    
    import static org.junit.jupiter.api.Assertions.assertEquals;
    
    @SpringBootTest
    @TestPropertySource(locations = "classpath:test-application.yml")
    public class AppPropertiesTest {
    
        @Autowired
        private AppProperties appProperties;
    
        @Test
        public void testAppProperties() {
            assertEquals("TestApp", appProperties.getName());
            assertEquals("1.0.1", appProperties.getVersion());
        }
    }
    

    问题:如何处理未绑定的属性?

    解决方案:可以在@ConfigurationProperties注解中使用ignoreUnknownFieldsignoreInvalidFields属性来控制未绑定属性的处理方式。例如:

    @ConfigurationProperties(prefix = "app", ignoreUnknownFields = false, ignoreInvalidFields = false)
    public class AppProperties {
        // Class definition
    }
    

    小结

    通过今天的学习,我们了解了@ConfigurationProperties的基本用法和应用场景,以及如何在Spring Boot框架中绑定和使用外部配置属性。明天我们将探讨另一个重要的Spring注解——@EnableScheduling


    相关链接

    希望这个示例能帮助你更好地理解和应用@ConfigurationProperties注解。如果有任何问题或需要进一步的帮助,请随时告诉我。

  • 相关阅读:
    【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件
    方法调用过程
    博途1200PLC轴控功能块(脉冲轴)
    解决Maven爆红以及解决 Idea 卡在 Resolving问题
    一文拿捏 Spring Bean的生命周期
    【CSS】flex布局,
    (详解)Vue自定义指令
    echarts散点图的圆点设置成不同的自定义图片且使用本地静态资源图片的写法
    【C++】单例模式
    千梦网创:你现在赚的钱是三年前选择的结果
  • 原文地址:https://blog.csdn.net/run65536/article/details/140003097