开发者

使用@ConfigurationProperties实现类型安全的配置过程

开发者 https://www.devze.com 2023-02-14 10:27 出处:网络 作者: 思影影思
目录@ConfigurationProperties实现类型安全的配置问题描述实践关于ConfigurationProperties注解的说明总结@ConfigurationPropephprties实现类型安全的配置
目录
  • @ConfigurationProperties实现类型安全的配置
    • 问题描述
    • 实践
  • 关于ConfigurationProperties注解的说明
    • 总结

      @ConfigurationPropephprties实现类型安全的配置

      问题描述

      从之前@Value的使用,可以知道@Value可以灵活的把配置文件中的键值对的值注入到Bean中供我们使用,已经很灵活了,但这还不够,比如下述的application.properties

      tomcat.ip=192.168.1.110
      tomcat.po编程客栈rt=8787
      tomcat.projectName=screenshot
      tomcat.userName=admin
      tomcat.password=admin
      

      如果也要按照之前的描述,使用@value就要填写5次,这显然令人惆怅,在程序员的世界里,所有重复性的工作都应该开发者_C学习被取代,因此Spring Boot为我们提供了@ConfigurationProperties注解。

      实践

      application.properties

      tomcat.ip=192.168.1.110
      tomcat.port=8787
      tomcat.projectName=zwQcLJnwjscreenshot
      

      从上述的配置项中,可以看到明显的相似性,即这一簇配置均以tomcat开始,类似String类中的startWith函数。

      核心代码

      package com.wisely.ch6_2_3.config;
      
      import lombok.Getter;
      import lombok.Setter;
      import lombok.extern.log4j.Log4j;
      import org.springframework.boot.context.properties.ConfigurationProperties;
      import org.springframework.stereotype.Component;
      @Component
      @ConfigurationProperties(prefix = "tomcat") //1
      @Log4j
      public class TomcatSetting {
          @Getter
          @Setter
          private String ip;
          @Getter
          @Setter
          private int port;
          @Getter
          @Setter
          private String projectName;
      
          public String getUrl() {
              return "http://"+getIp()+"/"+getPort()+"/"+getProjectName();
          }
      
      }
      

      通过这种方法,即可实现一次性注入相似的配置,非常方便。

      减少了重复性工作,即提高优雅度,也能减少错误,很酷。

      关于ConfigurationProperties注解的说明

      下文笔者讲述Spring Boot中ConfigurationProperties注解的相关说明

      如下所示:

      我们都知道在Spring中,可以使用zwQcLJnwj@Value对单个属性进行注入配置操作

      但是很多配置都具有一定的层级,那么此时Spring提供了一个基于层级配置的注解

      如下所示:

      @ConfigurationProperties注解的功能:

      • 将properties属性和一个Bean及其属性关联
      • 从而实现类型安全配置

      例:

      @ConfigurationProperties加载properties文件内的配置 使用prefix属性指定配置文件中定义的properties配置的统一前缀

      @ConfigurationProperties(prefix = "remote"}) 

      --js-Spring Boot1.5之前,使用以下配置指定properties文件的位置

      @ConfigurationProperties(prefix = "remote",locations={"classpath:remote.properties"})

      示例代码如下:

      remote.address= www.Java265.com
      remote.port= 9090
      
      
      @Component
      @PropertySource({"classpath:remote.properties"})
      @ConfigurationProperties(prefix = "remote")
      public class RemoteConfig {
       
        private String address;
        private int port;
        // getter/stetter方法
      }

      对应RemoteConfig的Bean的使用:

      @RestController
      public class ConfigurationController {
        @Resource
        private RemoteConfig remoteConfig;
        @GetMapping
        public void getInfo() {
          System.out.println("地址:" + remoteConfig.getAddress());
          System.out.println("端口:" + remoteConfig.getPort());
        }
      }
      
      //测试
      @SpringBootTest
      @AutoConfigureMockMvc
      class ConfigurationControllerTest {
        @Autowired
        private MockMvc mockMvc;
        @Test
        void getInfo() throws Exception {
          mockMvc.perform(MockMvcRequestBuilders.get("/"));
        }
      }
      
      -----运行以上代码,将输出以下信息------
      地址:www.java265.com
      端口:9090

      例:

      @ConfigurationProperties注解应用于Bean方法上的示例分享

      例:

      @Configuration
      public class MyConfig {
        @Bean
        @ConfigurationProperties(prefix = "user")
        public User user() {
          return new User();
        }
      }

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号