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

 更新时间:2023年02月13日 10:34:49   作者:思影影思  
这篇文章主要介绍了使用@ConfigurationProperties实现类型安全的配置过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

@ConfigurationProperties实现类型安全的配置

问题描述

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

tomcat.ip=192.168.1.110
tomcat.port=8787
tomcat.projectName=screenshot
tomcat.userName=admin
tomcat.password=admin

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

实践

application.properties

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

从上述的配置项中,可以看到明显的相似性,即这一簇配置均以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中,可以使用@Value对单个属性进行注入配置操作

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

如下所示:

@ConfigurationProperties注解的功能:

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

例:

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

@ConfigurationProperties(prefix = "remote"})  

---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();
    }
}

总结

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

相关文章

  • SpringCloud基于RestTemplate微服务项目案例解析

    SpringCloud基于RestTemplate微服务项目案例解析

    这篇文章主要介绍了SpringCloud基于RestTemplate微服务项目案例,在写SpringCloud搭建微服务之前,先搭建一个不通过springcloud只通过SpringBoot和Mybatis进行模块之间通讯,通过一个案例给大家详细说明,需要的朋友可以参考下
    2022-05-05
  • Idea中SpringBoot多模块项目的建立实现

    Idea中SpringBoot多模块项目的建立实现

    这篇文章主要介绍了Idea中SpringBoot多模块项目的建立实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java Dubbo服务调用扩展点Filter使用教程

    Java Dubbo服务调用扩展点Filter使用教程

    Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成
    2022-12-12
  • java基础知识之FileInputStream流的使用

    java基础知识之FileInputStream流的使用

    这篇文章主要介绍了java基础知识之FileInputStream流的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 解决MyEclipse中的Building workspace问题的三个方法

    解决MyEclipse中的Building workspace问题的三个方法

    这篇文章主要介绍了解决MyEclipse中的Building workspace问题的三个方法,需要的朋友可以参考下
    2015-11-11
  • 解决response.setHeader设置下载文件名无效的问题

    解决response.setHeader设置下载文件名无效的问题

    这篇文章主要介绍了解决response.setHeader设置下载文件名无效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 利用Jackson解决Json序列化和反序列化问题

    利用Jackson解决Json序列化和反序列化问题

    Jackson是一个用于处理Json数据的Java库,它提供了一系列功能,包括Json序列化和反序列化,所以本文就来讲讲如何利用利用Jackson解决Json序列化和反序列化的问题吧
    2023-05-05
  • Java异常详解_动力节点Java学院整理

    Java异常详解_动力节点Java学院整理

    异常是Java语言中的一部分,它代表程序中由各种原因引起的“不正常”因素。下面通过本文给大家介绍java异常的相关知识,感兴趣的朋友一起看看吧
    2017-06-06
  • 浅谈springboot与微服务架构

    浅谈springboot与微服务架构

    这篇文章主要介绍了浅谈springboot与微服务架构,SpringBoot是由 Pivotal团队提供的框架,其设计⽬的是⽤来简化新Spring应⽤,初始搭建以及开发过程,该框架使⽤了特定的⽅式来进⾏配置,需要的朋友可以参考下
    2023-07-07
  • Java 并发编程学习笔记之Synchronized简介

    Java 并发编程学习笔记之Synchronized简介

    虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据。今天我们就来一起讨论下线程安全问题,以及Java中提供了什么机制来解决线程安全问题。
    2016-05-05

最新评论